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

#include <stdio.h> int main() { char s[1001]; fgets(s,1001,stdin); int l=0; while(s[l]!='\0') l++; if (s[l-1]=='\n') { l--; } for (int i=l-1;i>=0;i--) { putchar(s[i]); } return 0; }
这段代码的功能是:从标准输入读取一行字符串(最多1000个字符),然后将其反转输出。它先计算字符串长度,再去除末尾可能存在的换行符,最后从后向前逐个字符打印。

- 代码中 `while(s[l]!='\0') l++;` 可以改用标准库函数 `strlen` 来简化,但这不是错误。
- 注意 `fgets` 会读取换行符并存入数组,所以代码中判断并去掉换行符是正确的做法。但有一个潜在问题:如果输入字符串长度恰好为1000(即数组满),则 `s[999]` 是最后一个有效字符,而 `s[1000]` 是 `'\0'`,此时 `s[l-1]` 可能不是换行符,因为 `fgets` 在空间不足时不会存储换行符。你的代码在这种情况下会错误地认为 `s[l-1]` 是换行符吗?实际上不会,因为 `l` 是字符串长度(包括换行符时),如果输入长度达到1000,则 `l` 为1000,`s[999]` 是最后一个字符,`s[1000]` 是 `'\0'`,此时 `s[l-1]` 即 `s[999]` 是有效字符,不是换行符,所以不会执行 `l--`,这是正确的。但若输入正好1000个字符且最后一个字符是换行符?不可能,因为 `fgets` 最多读入1000-1=999个字符加上换行符和空字符,所以数组满时换行符不会被存储。因此你的代码逻辑是安全的。