与空字符串相比,C 程序不会终止

C Program won't terminate after compared to empty string

我试图通过检查空字符串 ("") 来终止我的 C 程序,但它似乎不起作用。我也曾尝试与“\0”进行比较,但无济于事。

#include <stdio.h>
#include <string.h>

int main(void) {
    char nameInput[128];
    for(;;) {
        printf("Enter nation name: ");
        scanf("%s", nameInput);
        if(!strcmp(nameInput, "")){
            break;
        }
        printf("Got nation named \"%s\"\n", nameInput);
    }
    printf("All done getting nations!\n");
    return 0;
}

并不是它不会终止,它正在等待(尚未)输入的输入。

scanf 没有使用正确的模式字符串在回车 return 之前扫描任何内容(包括什么都没有)。您需要查看 scanf 模式,并将您的模式从“%s”更改为 scanf 将接受作为输入的内容。

如果你测试你的程序,你会看到在按下 "enter" 之后你可以输入一个词并再次按下 enter,因为你现在在输入中有一个词,scanf 拾取它(丢弃空格,因为它应该使用“%s”)。

scanf("%s", nameInput); 中的 "%s" 说明符首先消耗 1 并丢弃前导白色-space,包括来自 '\n' 扫描保存到nameInput前输入.

这就是重复输入空行不会推进扫描的原因。 "%s" 正在等待一些非白色-space 输入。


scanf() 的更好替代方法是使用 fgets() 读取所有用户输入,然后解析 字符串 .

fgets() 读取 并将结果保存为 字符串 - 通常包括该行的结尾 '\n'.

// scanf("%s", nameInput);
if (fgets(nameInput, sizeof nameInput, stdin)) {
  // Success at reading input.
  nameInput[strcspn(nameInput, "\n")] = '[=10=]'; // lop off the potential trailing \n

  if(!strcmp(nameInput, "")){  // or simply `if(nameInput[0] == '[=10=]')
    break;
  }
  ...

have tried to compare to "[=35=]" as well but it was to no avail.

if(!strcmp(nameInput, ""))if(!strcmp(nameInput, "[=21=]")) 做同样的事情。 strcmp() 正在比较 字符串

"" 是 1 char 字符串文字 空字符 .
"[=25=]" 是 2 char 字符串文字 :两个 空字符 .
字符串比较在第一个空字符.

处停止

"%s" 本身也没有宽度限制。代码没有针对像 "BlahBlah...(120_some_more)Blah" 这样的输入的安全防护措施,并且由于 char nameInput[128]; 的缓冲区溢出可能导致 未定义的行为 。代码可以使用 "%127s" 来防止这种情况,但这只能解决 scanf() 的缺点之一。


1

Input white-space characters (as specified by the isspace function) are skipped, unless the specification includes a [, c, or n specifier. C17dr § 7.21.6.2 8