如何在C中创建命令行?

时间:2016-12-28 22:28:39

标签: c scanf

我正在尝试在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。为什么会这样?

谢谢

3 个答案:

答案 0 :(得分:5)

使用fgets来读取整个输入,如下所示:

char cmd[255];
fgets(cmd, 255, stdin);

可以找到样本here

此外,您的示例中未正确使用strcmp函数。Strcmp返回:

  • < 0当不匹配的第一个字符在ptr1中的值低于ptr2时,
  • 当他们相等时
  • 0
  • '> 0当不匹配的第一个字符在ptr1中的值大于在ptr2中的值时

因此,在您的示例中,您应该使用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()将信息读入你的命令名变量。