#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是数组的越界判断标志。
你这里有两个循环,每个循环都要把判断条件理清楚。
我没有分析代码逻辑,只是单纯的看问题,你可以修改调试你的代码。
for (; str[i] != ' '; i++) 改为 for (; str[i] != ' ' && str[i] != '.'; i++)