一个以'.'结尾的简单英文句子,单词之间用空格分隔,没有缩写形式和其它特殊形式。


#include<stdio.h>
int main()
{
    char str[500];
    int i = 0, place, max = 0, count = 0, last_locate;
    gets_s(str);
    while (str[i] != '.')
    {
        if (str[i] == ' ')
            i++;
        place = i;
        for (; str[i] != ' '; i++)
            if (str[i] >= 'a' && str[i] <= 'z' || str[i] >= 'A' && str[i] <= 'Z')
                count++;
        if (count > max)
        {
            max = count;
            last_locate = place;
        }
        count = 0;
    }
    for (i = last_locate; str[i] != ' ' && str[i] != '.'; i++)
        printf("%c", str[i]);
    return 0;
}

报错说这句for (; str[i] != ' '; i++)内存访问冲突,感觉没问题啊?

你这个报错是因为你软件进入死循环了,索引i一直增加,然后就指向一些保护地址了,所以就报错了。
你代码有问题

#include<stdio.h>
int main()
{
    char str[500];
    int i = 0, place, max = 0, count = 0, last_locate;
    gets_s(str);
    while (str[i] != '.')//你本意是用这个来检测结束符,但是你下面Line13又嵌套了一个for循环增加i,导致你不能检查每一个字符,错过“.”进死循环
    {
        if (str[i] == ' ')
            i++;
        place = i;
        for (; str[i] != ' '; i++)//这里的条件也又问题,如果后面没有空格符了也会进死循环
        {
            if (str[i] >= 'a' && str[i] <= 'z' || str[i] >= 'A' && str[i] <= 'Z')
                count++;
        }
        if (count > max)
        {
            max = count;
            last_locate = place;
        }
        count = 0;
    }
    for (i = last_locate; str[i] != ' ' && str[i] != '.'; i++)
        printf("%c", str[i]);
    return 0;
}

报错是因为你越界了。循环条件str[i] != ' '应改为str[i] && str[i] != ' ',因为你必须判断是否已经到了字符串结尾,如果遇到'\0',循环应该终止。
同样,外层循环也应该判断当前字符是否是'\0'

重要的事说三遍:使用数组时(尤其时for循环),不要数组越界,不要数组越界,不要数组越界。
你要知道,数组存储字符串,默认是会在字符串后面加一个终结符'\0' 这个是字符串有效长度的判断标志,而数组的500是数组的越界判断标志。
你这里有两个循环,每个循环都要把判断条件理清楚。

我没有分析代码逻辑,只是单纯的看问题,你可以修改调试你的代码。

img

    for (; str[i] != ' '; i++) 改为 for (; str[i] != ' ' && str[i] != '.'; i++)