使用scanf()进行动态分配

我的问题与此问题完全相同。 也就是说,我正在尝试使用scanf()来接收一个不确定长度的字符串,我希望scanf()为它动态分配内存。

但是,在我的情况下,我正在使用VS2010。 据我所知,MS的scanf()在扫描字符串时没有a或m修饰符。 有没有办法做到这一点(除了一次接收输入一个字符)?

如果你想使用scanf你可以只分配一个足够大的缓冲区来保存任何可能的值,比如1024字节,然后使用1024的最大字段宽度说明符。

ma是特定的非标准GNU扩展,因此微软编译器不支持它们。 人们可以希望视觉工作室做到了。

以下是使用scanf读取设置的示例,只需将其打印出来即可:

 #include  #include  #include  int main( int argc, char **argv ) { // usage ./a.out < settings.conf char *varname; int value, r, run = 1; varname = malloc( 1024 ); // clear errno errno = 0; while( run ) { // match any number of "variable = #number" and do some "processing" // the 1024 here is the maximum field width specifier. r = scanf ( "%1024s = %d", varname, &value ); if( r == 2 ) { // matched both string and number printf( " Variable %s is set to %d \n", varname, value ); } else { // it did not, either there was an error in which case errno was // set or we are out of variables to match if( errno != 0 ) { // an error has ocurred. perror("scanf"); } run = 0; } } return 0; } 

这是一个settings.conf示例

 cake = 5 three = 3 answertolifeuniverseandeverything = 42 charcoal = -12 

您可以在联机帮助页上阅读有关scanf更多信息。

你当然可以使用getline() ,然后在字符之后解析字符。

如果你想进一步了解你想要达到的目标,你可能会得到一个更好的答案。

标准版本的scanf()不会为其读入的任何变量分配内存。

如果您在某些版本的scanf()被蒙骗使用非标准扩展,那么您刚刚学习了如何编写可移植代码的第一课 – 请勿使用非标准扩展。 您可以细微说“不要使用您感兴趣的所有平台上都不可用的扩展”,但要意识到这组平台可能会随着时间的推移而发生变化。

你绝对必须使用scanf吗? 不是std::string s; std::cin >> s; std::string s; std::cin >> s;getline( std::cin, s ); 你的选择?

我认为,在现实世界中,需要对用户输入的长度有一些最大限制。

然后你可以用getline()来读取整行。 见http://www.cplusplus.com/reference/iostream/istream/getline/

请注意,如果您需要来自用户的多个输入,则不需要为每个输入分别使用单独的char数组。 您可以使用一个大缓冲区(例如char buffer[2048] getline()getline() ,并将内容复制到适当分配(和命名)的变量,例如char * name = strdup( buffer )

不要使用scanf来读取字符串。 它可能甚至没有你认为它做的事情; %s只读到下一个空格。