使用'for'和'while'循环时出现问题循环停不下来

3

我希望有一个程序,可以从用户那里读取两个单词,并打印出第一个单词中第二个单词出现的次数。

当我使用for循环时,它完全按照我的要求工作,但是当我使用while循环并尝试特定输入时,它没有给出正确的结果。我无法弄清楚为什么。下面是代码片段。

使用for循环:

#include <stdio.h>

int main() 
{
    char text[200], search[20];
    int i, j, count = 0;
    scanf("%s %s", text, search);
    for (i = 0; text[i] != '\0'; i++) {
        for (j = 0; search[j] != '\0' && search[j] == text[i + j]; j++) {
        }
        if (search[j] == '\0') {
            count++;
        }
    }
    printf("%d", count);
}

使用while循环:

#include <stdio.h>

int main()
{
    char word[50], search[50];
    int i, j, count = 0;
    scanf("%s %s", word, search);
    i = 0;
    while (word[i] != '\0') {
        j = 0;
        while (search[j] != '\0' && search[j] == word[i + j]) {
            j++;                
        }
        if (search[j] == '\0') {
            count++;
        }
        i++;
    }
    printf("%d", count);
}

这是一种与 for 循环配合使用正常工作但与 while 循环不正确的输入方法:

athousandyearsofthousandtimesandinthousandplacesOand... and

应该打印4,但是它打印了3026483


你的空格键坏了吗?此外,未检查 scanf() 的返回值是不好的。 - John Zwinck
3
您的输入看起来比49个字符更长。 - Joni
1
你不仅仅将for循环改为了while循环。你还将text[200]更改为word[50],并将search[20]更改为search[50] - user253751
1
他们说 int main(void)int main() 更好。 - Meninx - メネンックス
1个回答

4
for循环和while循环都是正确的,问题在于输入缓冲区的大小。
在第一个程序中,text有200个字符,而在第二个程序中,word有50个字符。您的输入字符串长度为55个字符,因此它会溢出您的输入缓冲区,导致未定义行为
将第二个程序中的输入缓冲区扩大,它就应该正常工作了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接