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

问题描述 投票:1回答:2

我试图通过检查一个空字符串(“”)来终止我的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;
}
c c-strings control-flow
2个回答
3
投票

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

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

如果测试程序,您将看到在按“输入”之后,您可以输入一个单词,然后再次按Enter,由于输入中现在有一个单词,因此scanf会将其选中(丢弃空格,应使用“%s”)。


1
投票

"%s"中的[scanf("%s", nameInput);”首先从Enter消耗并丢弃包含'\n'的前导空白,然后扫描并保存到nameInput

这就是重复输入空白行不会使扫描前进的原因。 "%s"正在等待某些非空白输入。


scanf()的更好替代方法是使用fgets()读取用户输入,然后解析string

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

  if(!strcmp(nameInput, "")){  // or simply `if(nameInput[0] == '\0')
    break;
  }
  ...
© www.soinside.com 2019 - 2024. All rights reserved.