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

#include <stdio.h> int main() { char s[1001] = {0}; fgets(s, sizeof(s), stdin); int count = 0, i, j; for (i = 0; s[i] != '\0'; i++) { if (s[i] >= 'A' && s[i] <= 'Z') { s[i] = s[i] + 32; } char first = s[i]; char last; for (j = i; s[j] != ' ' && s[j] != '\0'; j++) { if (s[j] >= 'A' && s[j] <= 'Z') { s[j] = s[j] + 32; } last = s[j]; } if (first == last) count++; i=j; } printf("%d", count); return 0; }
这段代码试图统计输入字符串中首尾字母相同的单词个数。它先将大写字母转为小写,然后遍历每个单词,比较单词的第一个和最后一个字符。

代码中存在逻辑错误,导致计数不准确。

- 外层循环的 `i` 在每次单词处理完后被设置为 `j`,但 `j` 在循环结束时指向的是空格或字符串结束符,这会导致外层循环跳过单词后的字符,但可能漏掉单词本身的首字母比较逻辑。
- 内层循环中,`first` 被赋值为 `s[i]`,但 `s[i]` 可能已经被转换为小写,而 `last` 在内层循环结束时才被赋值,但内层循环的 `j` 在退出时已经指向空格或 `\0`,所以 `last` 实际上取到了单词后的第一个非字母字符,而不是单词的最后一个字母。