Могут ли функции scanf и printf работать с переменными типа string? Если да, то как это сделать, например, в данном коде?
scanf_s("%s", &TempFirstName);
pSMass[i].FirstName = TempFirstName;
printf_s("%s", pSMass[i].FirstName);
Это, конечно, бред - использовать функции 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++ для считывания строк...
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники