我正在尝试在C中为应用创建命令行。
int main(int argc, char const *argv[])
{
char cmd[40];
do {
scanf("%[^\n]", cmd);
if(strcmp(cmd, "start"))
new_game();
} while(strcmp(cmd, "exit"));
return 0;
}
我不能使用“%s”,因为该命令可能有多个参数,所以我需要使用该异常并忽略新的行char。问题是程序在插入一次后不再调用scanf。为什么会这样?
谢谢
答案 0 :(得分:5)
使用fgets
来读取整个输入,如下所示:
char cmd[255];
fgets(cmd, 255, stdin);
可以找到样本here。
此外,您的示例中未正确使用strcmp
函数。Strcmp
返回:
因此,在您的示例中,您应该使用strcmp(str1, str2) == 0
或!strcmp(str1, str2)
。
注意: 使用fgets
时应小心。 fgets
认为换行符有效,字符串中包含。在scanf(" %s")
的另一边,结果字符串中的换行符不包含。
答案 1 :(得分:1)
strcmp(cmd, "start")
表示"当cmd不等于start"。您需要!strcmp(cmd, "start")
。
答案 2 :(得分:1)
该程序因为您读取了第一个换行符之前的所有内容而卡住了,但之后又返回并且scanf()
找到了换行符,扫描集不允许这样做,因此它不会读取任何字符和叶子下一轮循环的新线。
您应该检查scanf()
的返回值;如果为零,则下一个字符对格式字符串无效。
你必须阅读换行符。
一种简单的方法是在格式字符串中设置%[…]
扫描集之前包含空格。在读取其余信息行之前,跳过前导空格(包括换行符)(39
可防止缓冲区溢出):
if (scanf(" %39[^\n]", cmd) == 1)
…process the string in cmd…
else
…report error…
另一种简单的方法是在scanf()
:
int c;
while ((c = getchar()) != EOF && c != '\n')
;
或者,正如其他人所建议的那样,读取一行输入,然后处理,也许用sscanf()
将信息读入你的命令名变量。