在线编译器 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++) { char first; if (s[i] != ' ') { if (i == 0 || s[i - 1] == ' ') { first = s[i]; for (j = i; s[j] != ' '; j++) { if (s[j] == '\0') break; } if (first == s[j - 1] + 32 || first == s[j - 1] - 32 || first == s[j - 1]) count++; } } } printf("%d\n", count); return 0; }
这段代码的功能是:从标准输入读取一行字符串,统计其中首尾字母相同(忽略大小写)的单词个数,并输出结果。

代码通过遍历字符串,找到每个单词的开始位置,然后找到该单词的结束位置,最后比较单词的首字母和尾字母(考虑大小写差异)。

- 注意代码中 `s[j] == '\0'` 的检查位置。当单词正好在字符串末尾时,内层循环会一直走到 `s[j] == '\0'` 才跳出,但此时 `j` 已经指向了字符串结束符,而后续比较 `s[j-1]` 时,`j-1` 是最后一个有效字符,这是正确的。但内层循环的条件 `s[j] != ' '` 在遇到 `\0` 时不会停止,所以需要 `break` 来退出,这个逻辑是可行的。

- 提示1:考虑一下,如果字符串末尾有换行符(`\n`),`fgets` 会将其读入。你的代码中,换行符会被当作单词的一部分吗?例如输入 `"abc\n"`,单词 `"abc\n"` 的首尾字母比较会出错。你可以思考如何处理这种情况。

- 提示2:比较首尾字母时,你用了 `+32` 和 `-32` 来转换大小写。这种方法只适用于 ASCII 编码,且假设字母连续。更安全的方式是使用标准库函数 `tolower` 或 `toupper`,这样代码更清晰且不易出错。