字符串最长

时间:2016-03-01 16:06:54

标签: c string

#include <stdio.h>
#include <string.h>
int main()
{
    char string[100], word[20], max[20];
    int i = 0, j = 0, flag = 0;
    printf("Enter string: ");
    gets(string);
    for (i = 0; i < strlen(string); i++)
    {
        while (i < strlen(string) && string[i]!=32 && string[i]!=0)  //line 1
        {
            word[j++] = string[i++];
        }
        if (j != 0)
        {
            word[j] = '\0';
            if (!flag)
            {
                flag = !flag;
                strcpy(max, word);
            }
            if (strlen(word) > strlen(max))
            {
                strcpy(max, word);
            }
            j = 0;
        }
    }
    printf("The largest word is '%s' .\n", max);
    return 0;
}

我遇到了这个代码,它找到给定字符串中最长的单词,并在多次出现相同长度单词的情况下返回最后一个单词

(1)我不明白为什么输出不依赖于max [],我的意思是最后我们  正在打印max []中最长的单词,其大小为max [20],但即使对于非常大的单词,它也会提供正确的输出,将其更改为max [10]也可以。

(2)在第1行中我们为什么要测试string[i]!=0,因为删除它没有      效果,我们已经在while循环的第一部分测试了i < strlen(string)。但是当我尝试string[i]!='\0'时,我的某些输入字符串输出不正确。

我在哪里错过了这两个的逻辑?

@callyalater,我把max []放在word []和string []之前,但它对输出没有影响,但是对于max [5]和输入字符串&#34; arrenhius等式很难解读zxcvbnmlkjhgfdsaqwertyuiop&#34;产出是&#39; arrenzxcvbnmlkjhgfdsaqwertyuiop&#39;在提供的在线编译器链接上但是对于max [10]工作正常,但在我的编译器(dev c ++)中,输出给出了max [5]和max [10]的正确结果,这两者都是&#39; zxcvbnmasdfghjklqwertyuiop&#39;。 / p>

1 个答案:

答案 0 :(得分:0)

char string[100], word[20], max[20];
int i = 0, j = 0, flag = 0;

过度运行最大值,将修改i或单词

内存可以如下使用

+-------+-------------+-------+
| word  | max         | i     |
+-------+-------------+-------+

+-------+-------------+-------+
| i     | max         | word  |
+-------+-------------+-------+

因此,将超过20个字节写入最大值,可能会修改单词,或者i - 因为它会超出。

当您超出这些内存项时,您输入的是未定义的行为,这可能有效(如您所见)或崩溃。

string[i] !=0正在防范其中一些失败。