Онлайн компилятор C

#include<stdio.h> const int M=1000; char N(char c) { if(c>='A'&&c<='Z') { return c=c+32; } return c; } int main() { int count=0; char str[M+1]; int i=0; char ch; while((ch=getchar())!='\n') { str[i]=ch; i++; } str[i]='\0'; int k=0; char first; char last; while(str[k]!='\0') { while(str[k]==' ') k++; first=str[k]; while(str[k]!=' ') { k++; } if(str[k]==' ') { k--; last=str[k]; } if(N(first)==N(last)) { count++; } } printf("%d",count); return 0; }
这段代码试图统计输入字符串中,每个单词的首字母和尾字母(忽略大小写)相同的单词数量。代码逻辑存在几个问题。

- 代码中 `k` 的移动逻辑有问题。当遇到空格时,`k` 先减一取尾字母,但之后没有正确跳过单词间的空格,导致循环可能陷入死循环或错误处理。
- 当字符串末尾没有空格时,最后一个单词的尾字母获取方式不完善,因为循环条件 `str[k]!=' '` 会一直走到字符串结束符 `\0`,但代码没有处理这种情况。
- 变量 `first` 和 `last` 在循环中每次都会更新,但 `last` 的赋值依赖于 `str[k]==' '` 的判断,如果单词后直接是 `\0`,则 `last` 不会被正确赋值。

- 建议检查内层循环结束后,`k` 的位置是否正确指向下一个单词的开始,以及如何处理字符串结尾的情况。
- 考虑使用一个更清晰的循环结构,比如每次处理一个单词时,先记录单词起始位置,然后找到单词结束位置,再比较首尾字符。