Использование string в функциях scanf и printf

384
08 мая 2017, 02:27

Могут ли функции scanf и printf работать с переменными типа string? Если да, то как это сделать, например, в данном коде?

scanf_s("%s", &TempFirstName);
pSMass[i].FirstName = TempFirstName;
printf_s("%s", pSMass[i].FirstName);
Answer 1

Это, конечно, бред - использовать функции C с классами C++, но в принципе можно, хотя и не так, как указали вы.

printf - очень просто, передавать надо результат вызова c_str():

string s;
...
printf("%s",s.c_str());

Со scanf все гораздо хуже! Непосредственно со scanf не поработаешь, нужно сначала выделить в строке место, а потом передать указатель, но так как до C++17 .data() возвращает const char*, то формально следует использовать &s[0]. Но все знакомые мне компиляторы кушают и .data() - см., например, http://ideone.com/nzJE2S. VC++ тоже съедает - с предупреждением.

int main(int argc, const char * argv[])
{
    string s;
    s.reserve(100);
    scanf("%s",s.data());
    printf("You wrote: %s, %d chars\n",s.c_str(),s.length());
}

Но! Беда в том, что string при этом не знает, что в нем находится какая-то строка, и если вы запросите длину строки - она будет нулевой. Это просто использован буфер. Поэтому здесь в принципе никто ничего гарантировать не может. Тот же VC++ ухитряется верно обновить длину с помощью s = s.data(), но GCC, например, при этом строку просто обнуляет. Указать корректный способ обойти это затруднение я не могу.

Но, по большому счету, это правильно, потому что даже такое изменение строки - не через ее интерфейс, а через указатель на внутренний буфер - уже нарушает принцип инкапсуляции.

Так что scanf'уйте в массив char, а им инициализируйте string - это корректно и надежно. Хотя и просто смешно при наличии соответствующий возможностей C++ для считывания строк...

READ ALSO
Содержит ли данный код UB

Содержит ли данный код UB

UB вряд ли (хотя пусть это подтвердят гуру в стандартах), но вот огрести так неприятностей - запростоПредставим, что Test запрашивает какой-то...

266
Цвет консоли c++

Цвет консоли c++

Меняю цвет консоли этой строчкой, вопрос вот в чемКак после конкретных манипуляций восстановить дефолтный цвет консоли?

347
Поддержка разных языков

Поддержка разных языков

ЗдравствуйтеПроблема заключается в следующем

315
Smarty PHP модальное окно

Smarty PHP модальное окно

ЗдравствуйтеЕсть данный код на smarty, который добавляет на страницу формы для отправки информации на почту

372