我希望能从标准输入中获取一个字符串,但我不想使用固定大小的静态数组。
我知道scanf需要一个位置来保存标准输入的值,但我不能这样做:
char string[10]
scanf("%s",string);
因为我需要知道字符串的长度,以便分配正确的内存空间。
你能帮我解决这个问题吗?
哇喔喔喔喔
我还在被这个问题困扰着......我要疯了
你能给我一个可行的代码吗?
不要使用scanf,而应该使用fgets,这可以防止读入过多的字符。
char tmp[256]={0x0};
while(fgets(tmp, sizeof(tmp), stdin)!=NULL)
{
printf("%s", tmp);
}
fgets函数会在行末返回一个'\n',当标准输入关闭或遇到错误时返回NULL。
先试着运行它,看看它的功能。如果需要将输入行分成字段,可以在tmp上使用sscanf(),sscanf的用法与scanf相同,但是作用于字符串。
fgets()
,则如果缓冲区足够大,则最有可能在末尾有一个'\n'
字符。一些人可能会通过strtok()
函数将其移除,但这是不安全的。char *get_line (char *s, size_t n, FILE *f)
{
char *p = fgets (s, n, f);
if (p != NULL) strtok (s, "\n");
return p;
}
您可以使用以下方式逐个字符处理输入数据:
int getc(FILE *stream);
或者
int getchar(void);
您可以通过以下方式确保不会超出缓冲区:
char buffer[128];
printf("Input Text: ");
fgets(buffer,127,stdin);
如果您需要可变大小的输入,则只需保持获取相同固定大小的输入即可。
char string[10];
scanf("%10s" string);
这会强制要求尊重缓冲边界,但需要格式字符串意识到缓冲区的大小。我通常通过声明两者都为常量来解决这个问题:
#define BUFSIZE 10
#define BUFFMT "%10s"
如果你正在使用GNU系统,你也可以利用GNU扩展:getline(3)函数可以避免很多麻烦!请看这里。
getline()
函数。如果您无法访问此类函数,请考虑使用相同接口自己编写。