与空字符串相比,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
我试图通过检查空字符串 ("") 来终止我的 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
, orn
specifier. C17dr § 7.21.6.2 8