gpt4 book ai didi

c - 带分号的 while 循环

转载 作者:行者123 更新时间:2023-11-30 18:17:51 24 4
gpt4 key购买 nike

这个指令有什么作用? while 循环中的分号有什么用?

while (scanf("%s", &s[strlen(s)]) == 1);

我正在编写一个程序来检查字符串是否是全字词。完整代码如下:

int main() {

char s[100];
while (scanf("%s", &s[strlen(s)]) == 1);
char big[26] = {0};
char small[26] = {0};
for (int i = 0; i < strlen(s); i++) {
if (s[i] >= 'a' && s[i] <= 'z') {
small[s[i] - 'a'] = 1;
}
else if (s[i] >= 'A' && s[i] <= 'Z') {
big[s[i] - 'A'] = 1;
}
}

for (int i = 0; i < 26; i++) {
if (!(big[i] == 1 || small[i] == 1)) {
printf("not pangram");
return 0;
}
}

printf("pangram");

return 0;

}

最佳答案

strlen(s) 返回字符串的长度(假设它实际上是一个正确终止的字符串)。

s[strlen(s)] 因此指定字符串的终止空字节。

因此,

&s[strlen(s)] 是指向字符串终止符的指针,或者等效地,指向 s 的零长度尾部子字符串。

scanf("%s", &s[strlen(s)]) 因此尝试将标准输入中的空格分隔字符串扫描到 s 的尾部。如果 s 有足够的未使用空间并且输入确实可用,那么这很可能会成功。如果是,则 scanf() 返回 1,即成功扫描的输入字段的数量。

如果在扫描任何非空白之前检测到文件末尾,则 scanf() 将返回零,而不向 s 添加任何内容。

因此,每次测试 while 条件 (scanf("%s", &s[strlen(s)]) == 1) 时,它都会尝试将标准输入中的下一个字符串附加到 s 的末尾。

循环体是一个空语句(;)。这不会执行任何操作,因此整个循环只是重复测试循环条件,直到其计算结果为 false。假设 s 最初是一个终止字符串,并且它有足够的空间,这会产生将标准输入(减去所有空格)连接到 s 中的总体副作用。但是,如果不满足这些条件,则行为未定义。

由于您没有采取任何措施来确保 s 最初终止,因此您将面临 UB 的严重风险(尽管该行为是否已定义实际上是不确定的)。此外,您的程序很容易受到缓冲区溢出的影响,因为它将用户提供的输入扫描到固定大小的缓冲区中,而不验证是否有足够的可用空间。

关于c - 带分号的 while 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36428659/

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