我试图找到一种方法来结束程序,如果用户点击输入没有输入scanf()。我尝试了不同的方法但没有任何方法可以帮助我。 我用过这段代码
int main()
{
char line[40];
while (1)
{
scanf("%s",line);
if (line == NULL)
{
break;
}
}
return 0;
}
答案 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
)可能不是终端(想到redirections或pipelines),所以你的问题没有任何意义一般
当然,您应该阅读standard IO函数的文档,编译包含所有警告和调试信息的代码(gcc -Wall -Wextra -g
与GCC一致),然后use the gdb
debugger以了解你的计划的行为。
您可以(也可能应该)使用fgets(但不要忘记测试其结果以防止失败)。如果您的系统有这些系统,您可以考虑使用getline(3)甚至readline(3)。