Online Compiler 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++; } 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()` 逐个读取字符,但 `scanf("%d", &k)` 读取整数后,输入缓冲区中会留下一个换行符 `\n`。当 `while` 循环开始读取时,第一个读到的字符就是这个换行符,而不是你期望的字符串的第一个字符。因此,实际存储的字符串开头多了一个换行符,导致后续的移位结果不正确。

- 检查输入读取部分:在 `scanf` 读取整数后,需要处理掉缓冲区中残留的换行符,否则它会被 `getchar` 当作字符串的第一个字符读入。
- 思考如何跳过这个多余的换行符,例如在 `while` 循环之前先读取并丢弃它,或者改用其他方式读取字符串(如 `fgets`),但注意不要直接给出完整解决方案。