我的问题与此one完全相同。也就是说,我正在尝试使用scanf()
来接收一个不确定长度的字符串,我希望scanf()
为它动态分配内存。
然而,在我的情况下,我正在使用VS2010。据我所知,MS的scanf()在扫描字符串时没有a或m修饰符。有没有办法做到这一点(除了一次接收输入一个字符)?
答案 0 :(得分:4)
scanf()
的标准版本不会为其读入的任何变量分配内存。
如果您曾在某些版本的scanf()
中使用非标准扩展程序蒙骗,那么您刚刚学习了如何编写可移植代码的第一课 - 请勿使用非标准扩展。你可以说“不要使用你感兴趣的所有平台上都没有的扩展”,但要意识到这套平台可能会随着时间而改变。
答案 1 :(得分:2)
你绝对必须使用scanf
吗? std::string s; std::cin >> s;
或getline( std::cin, s );
不适合您吗?
答案 2 :(得分:1)
如果你想使用scanf
,你可以只分配一个足够大的缓冲区来保存任何可能的值,比如1024字节,然后使用1024的最大字段宽度说明符。
m
和a
是特定的非标准GNU扩展,因此微软编译器不支持它们。人们可能希望视觉工作室能够做到。
以下是使用scanf
读取设置的示例,只需将其打印出来即可:
#include <stdio.h>
#include <errno.h>
#include <malloc.h>
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
on the manpages的更多信息。
你当然可以使用getline()
,然后在字符之后解析字符。
如果你想进一步了解你想要达到的目标,你可能会得到更好的答案。
答案 3 :(得分:0)
我认为,在现实世界中,需要对用户输入的长度有一些最大限制。
然后你可以用getline()
之类的内容阅读整行。见http://www.cplusplus.com/reference/iostream/istream/getline/
请注意,如果您想要来自用户的多个输入,则不需要为每个输入分别设置char
个数组。你可以有一个大缓冲区,例如char buffer[2048]
,用于与getline()
一起使用,并将内容复制到适当分配(和命名)的变量,例如像char * name = strdup( buffer )
这样的东西。
答案 4 :(得分:0)
请勿使用scanf
来读取字符串。它可能甚至没有你认为它做的事情; %s
只读到下一个空格。