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

Isa*_*uah 3 c c-strings control-flow

我试图通过检查空字符串 ("") 来终止我的 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;
}
Run Code Online (Sandbox Code Playgroud)

chu*_*ica 5

"%s"在符scanf("%s", nameInput); 首先消耗1和废弃前导空格包括所有'\n'Enter扫描并保存到之前nameInput

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


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

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

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

  if(!strcmp(nameInput, "")){  // or simply `if(nameInput[0] == '\0')
    break;
  }
  ...
Run Code Online (Sandbox Code Playgroud)

也尝试与“\0”进行比较,但无济于事。

if(!strcmp(nameInput, ""))if(!strcmp(nameInput, "\0"))做同样的事情。 strcmp()正在比较字符串

""是一个字符串字面量的1 char:将空字符
"\0"是2的字符串文字char:两个空字符
字符串在第一次比较停止空字符


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


1

输入的空白字符(由指定的isspace功能)被跳过,除非本说明书包括一个[cn说明符。C17dr § 7.21.6.2 8

  • @ReinstateMonica 我决定使用 fgets() 并重新定位它以适合我的代码。现在它起作用了。太感谢了 (2认同)