gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:01:09 24 4
gpt4 key购买 nike

我试图通过检查空字符串 ("") 来终止我的 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("%s", nameInput); 中的 "%s" 说明符首先使用1 并丢弃前导空格在扫描并保存到 nameInput 之前,包括 Enter 中的所有 '\n'

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


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

fgets() 读取 line 并将结果保存为 string - 通常包括行的结尾 '\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;
}
...

have tried to compare to "\0" as well but it was to no avail.

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

"" 是 1 个 char字符串文字:空字符
"\0" 是 2 个 char字符串文字:两个 空字符
string 比较在第一个 null 字符处停止。


"%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

关于与空字符串相比,C 程序不会终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61401082/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com