Online Compiler C

#include <ctype.h> #include <stdio.h> int main() { char s[1001]; fgets(s, sizeof(s), stdin); int count = 0; char *p = s; while (*p) { // while (*p && *p == ' ') p++; if (*p == '\0') break; // char *start = p; // ( ) while (*p && *p != ' ') p++; // char *end = p - 1; // if (tolower(*start) == tolower(*end)) { count++; } } printf("%d\n", count); return 0; }
这段代码的功能是:从标准输入读取一行字符串,然后统计其中有多少个单词的首字母和尾字母相同(不区分大小写)。代码通过指针遍历字符串,用空格分隔单词,对每个单词比较第一个和最后一个字符。

你的代码有一个逻辑错误。问题出在单词的结束位置判断上。当指针 `p` 移动到空格或字符串结尾时,`end = p - 1` 指向单词的最后一个字符。但如果单词后面紧跟的是字符串结束符 `\0`,那么 `p` 指向 `\0`,`end` 指向 `\0` 的前一个字符,这是正确的。但如果单词后面是空格,`p` 指向空格,`end` 指向空格的前一个字符,也是正确的。然而,当字符串开头就有空格时,第一个 `while` 循环会跳过空格,但如果整个字符串全是空格,`*p` 会是 `\0`,`break` 会退出,这没问题。但考虑一种情况:单词只有一个字符,比如 "a"。此时 `start` 和 `end` 都指向同一个字符,比较应该成立。但你的代码中,`end = p - 1`,如果单词只有一个字符,`p` 在遇到空格或 `\0` 时,`end` 指向该字符,`start` 也指向该字符,比较正确。所以问题可能不在单词边界,而在于你比较的是 `*start` 和 `*end`,但 `end` 可能指向的不是单词的最后一个字符,而是单词后的空格?不,`end = p - 1` 在 `p` 指向空格或 `\0` 时,确实指向单词最后一个字符。那问题出在哪里?

- 提示1:考虑字符串末尾没有换行符的情况。`fgets` 会读取换行符 `\n` 并存入字符串中。你的代码没有处理换行符,它会被当作一个普通字符。如果输入是 "hello\n",那么单词 "hello" 后面跟着换行符,你的循环中 `p` 遇到换行符时不会将其视为单词分隔符,因为条件只检查空格。这会导致单词的结束位置错误,`end` 可能指向换行符,而不是单词的最后一个字母。

- 提示2:检查你的循环条件 `while (*