如何找到scanf没有任何输入

时间:2018-06-02 15:51:07

标签: c

我试图找到一种方法来结束程序,如果用户点击输入没有输入scanf()。我尝试了不同的方法但没有任何方法可以帮助我。 我用过这段代码

int main()
{
    char line[40];
    while (1)
    {
         scanf("%s",line);
         if (line == NULL)
         {
              break;
          }
     }
      return 0;
}

2 个答案:

答案 0 :(得分:2)

您可能无法单独使用scanf执行您想要的操作。

显而易见的答案是查看scanf的返回值,因为它会告诉您它成功匹配了多少项:

while(1) {
    int r = scanf("%s", line);
    if (r < 1) {
          break;
    }

    printf ("you typed %s\n", line);
}

但由于scanf的{​​{1}}格式跳过了前导空格,并且由于换行符%s是空格,\n将在空白行中快乐地飞行,直到它找到一个非空字符返回。

您可以将scanf格式与%[]一起使用。这匹配字符类:某些字符,或(除了scanf)除某些字符之外的所有内容。您可以像这样使用它:

^

由于您要告诉while (1) { int r = scanf("%[^\n]", line); if (r < 1) { break; } printf ("you typed %s\n", line); getchar(); /* over the \n */ } 阅读除 scanf以外的所有内容,您必须执行其他操作 - 此处只需\n次呼叫 - 越过getchar,以便阅读下一行。

但是如果你想阅读这些内容,那么使用\n代码通常会更清晰,更容易:

fgets

(对于while(1) { if(fgets(line, 40, stdin) == NULL) { break; } printf ("you typed %s\n", line); } ,您的fgets数组中的终结\n字符会从fgets返回,这会带来额外的复杂性,具体取决于您所使用的内容。稍后再做,您可能需要采取措施将其删除。)

答案 1 :(得分:1)

您是否阅读了scanf的文档?它返回您应该测试的扫描项目数。

scanf之前,您应该考虑使用line清除memset(line, 0, sizeof(line))

并且您无法将字符串与==进行比较(此测试用于地址相等)。您可以使用strcmp(但不能使用NULL,但可能使用空字符串"")。

此外,您的问题可能是特定于操作系统的。由于终端的概念是特定于操作系统的(例如,对于Unix的观点,参见例如the tty demystified)。 C11标准n1570不知道或不关心终端或输入键。 standard streams(例如stdin读取的scanf)可能不是终端(想到redirectionspipelines),所以你的问题没有任何意义一般

当然,您应该阅读standard IO函数的文档,编译包含所有警告和调试信息的代码(gcc -Wall -Wextra -gGCC一致),然后use the gdb debugger以了解你的计划的行为。

您可以(也可能应该)使用fgets(但不要忘记测试其结果以防止失败)。如果您的系统有这些系统,您可以考虑使用getline(3)甚至readline(3)