Online Compiler C

#include <stdio.h> #include <string.h> int main() { char str[1005]; // 1. 读取一整行字符串(最多 1000 个字符) if (fgets(str, sizeof(str), stdin) == NULL) { return 0; } // 2. 获取字符串的长度 int len = strlen(str); // 3. 去掉字符串末尾可能存在的换行符 '\n' if (len > 0 && str[len - 1] == '\n') { str[len - 1] = '\0'; len--; // 长度相应减 1 } // 4. 使用变量 i 从后往前遍历并打印字符 // 最后一个字符的下标是 len - 1 for (int i = len - 1; i >= 0; i--) { putchar(str[i]); } printf("\n"); // 最后打印一个换行符结束 return 0; }
这段代码的功能是:读取用户输入的一行字符串,然后将其反转输出。它使用 `fgets` 读取整行,去掉末尾的换行符,然后从最后一个字符开始向前遍历并逐个打印。

- 注意 `fgets` 会读取换行符并存入字符串,代码中已经正确处理了这一点。
- 反转输出时,循环从 `len - 1` 到 `0`,这是正确的。

代码本身没有明显错误,但有一个潜在问题:如果输入字符串长度恰好为 1000 个字符(不含换行符),`fgets` 会读取前 1000 个字符,但不会包含换行符,此时 `str[len-1]` 不是换行符,代码不会去掉任何内容。这不会导致错误,但需要注意边界情况。

- 提示:考虑当输入字符串长度等于数组最大容量时,`fgets` 的行为是怎样的?是否会影响换行符的处理?
- 提示:如果输入包含中文字符(多字节编码),逐个字符反转可能会破坏字符完整性,但题目未明确要求处理多字节字符,所以当前做法对 ASCII 字符是安全的。