Online Compiler C

#include <stdio.h> int main() { char s[1001] = {0}; fgets(s, sizeof(s), stdin); int count = 0; for (int i = 0; s[i] != '\0'; i++) { char first = s[i], last; if (i == 0 || s[i - 1] == ' ') { first = s[i]; for (int j = i; s[j] != ' '; j++) { if (s[j] == '\0') break; last = s[j]; } } if (first == last) count++; } printf("%d", count); return 0; }
这段代码试图统计字符串中首尾字母相同的单词个数,但存在逻辑错误。

代码的思路是:遍历字符串,当遇到单词开头时(i==0或前一个字符是空格),记录该单词的首字母,然后向后找到单词的最后一个字母,再比较首尾是否相同。但实际实现中,`last`变量的更新方式有问题。

- 内层循环中,`last = s[j]`每次都会更新,循环结束后`last`保存的是单词最后一个字母的下一个字符(即空格或字符串结束符),而不是单词的最后一个字母本身。
- 另外,`first`变量在每次循环开始时被赋值为`s[i]`,但后面又重复赋值,逻辑冗余。

提示:
- 检查内层循环结束时`last`实际存储的是哪个字符。考虑当循环条件`s[j] != ' '`不满足时,`j`指向的是空格还是单词最后一个字母的下一个位置。
- 思考如何正确获取单词的最后一个字母,例如可以在内层循环结束后,将`j`减1再取`s[j]`。