【发布时间】:2016-03-26 02:37:28
【问题描述】:
这是我的代码的一部分。 gets 和sscanf 的目的是扫描三个由一个空格分隔的变量。如果通过,则再次输出指令。否则,输出错误并退出程序。
我想使用 7 长度的 char 数组来限制行中的数量,只获得像 'g 3 3' 这样的格式。但我的代码似乎有问题。
#include <stdio.h>
int main (void) {
char line[7];
char command;
int x, y;
while(1){
/* problem: g 4 4 or g 4 4 can also pass */
fgets(line, 7, stdin);
nargs = sscanf(line, "\n%c %d %d", &command, &x, &y);
if(nargs != 3){
printf("error\n");
return 0;
}
printf("%c %d %d\n", command, x, y);
}
}
意外:
g 4 4
g 4 4
error
预期:
g 4 4
g 4 4
// I can continue type
谁能告诉我为什么它仍然会重复指令?
【问题讨论】:
-
使用
sscanf时,格式字符串中的空格或换行符与输入中的零个或多个空白字符匹配。字符串g 4 4适合 7 字节缓冲区,并且匹配格式,所以它通过了。 -
g 4 4=>"g 4 4\n"=> fgets =>"g 4 4\0"=> 下一个 fgets"\n"=> sscanf return 0;增加行缓冲区。 -
是的,
g 4 4应该通过但g 4 4(g 和 4 之间的两个空格)应该失败。当我将限制更改为 6 个字符时,即使g 4 4也会失败。我想知道原因 -
1) 想要输入整行,而不考虑任何额外的空格。所以增加输入缓冲区的长度很多,建议50字节。 2) 在调用 fgets() 时使用
sizeof( line)所以只需要编辑一个地方。 3) 使用#define语句来设置line[]长度 4) 而不是sscanf(),遍历line[]数组来检查格式,因为sscanf()不会因为多余的空格而失败。