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

#include <stdio.h> int main() { int k, n = 0, p; char s[1001], t[1001]; scanf("%d", &k); while ((s[n] = getchar()) != EOF) { n++; } while(n&&(s[n]==' '||s[n]=='\n'))n--; s[n] = '\0'; // printf("k = %d s = %s\n", k,s); p = 0; for (int i = n - k; i < n; i++) { t[p++] = s[i]; } // printf("%s", t); for (int i = 0; i < n - k; i++) { t[p++] = s[i]; } t[p] = 0; printf("%s", t); return 0; }
这段代码试图实现一个字符串循环右移的功能,将字符串的后k个字符移到前面。但读取输入的方式和边界处理存在一些问题。

- 使用 `getchar()` 逐个读取字符直到EOF,但这样会把换行符也读入字符串,导致后续处理出错。而且 `scanf("%d", &k)` 之后输入缓冲区可能残留换行符,第一个 `getchar()` 会读到这个换行符。
- 循环右移的逻辑中,`n` 是字符串长度,但代码中 `n` 在读取时已经包含了换行符,虽然后面有去除尾部空白字符的步骤,但起始索引 `n - k` 可能因为 `n` 的值不正确而出错。