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)
将"%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功能)被跳过,除非本说明书包括一个[,c或n说明符。C17dr § 7.21.6.2 8