Online Compiler C

#include <stdio.h> int main() { int k, n = 0, p; char s[1001], t[1001]; scanf("%d", &k); getchar(); 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,但这样会把输入中的换行符也读入字符串,导致字符串长度计算不准确。而且输入通常以换行结束,不会遇到EOF,这会导致程序卡住。

其次,循环右移的逻辑有误。代码中`for (int i = n - k; i < n; i++)`试图取后k个字符,但这里的n是字符串长度,而字符串索引从0开始,最后一个字符的索引是n-1,所以后k个字符的起始索引应该是n-k,但循环条件`i < n`会多取一个字符。

- 检查字符串读取方式,考虑使用`fgets`或`scanf`配合格式说明符来读取一行字符串,而不是用`getchar`循环。
- 仔细检查循环右移的索引范围,确保正确分离后k个字符和前面的字符,注意数组索引从0开始。