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

#include <stdio.h> #include <string.h> int main() { long long int k; char a[1001],b[1001]; scanf("%lld", &k); scanf("%[^\n]", a); int lon = strlen(a); if(k > lon) { k = k % lon; } for(int i = 0; i< lon -k; i++) { b[i] = a[i]; } int j = 0; for(int i = lon - k; i< lon; i++) { b[j] = a[i]; j++; } for(int i = 0; i < lon; i++) { printf("%c", b[i]); } return 0; }
这段代码试图实现一个字符串循环右移的功能,但存在几个问题。

代码从输入读取一个整数k和一个字符串a,然后尝试将字符串a循环右移k位,结果存入b并输出。

主要问题在于:
- 第一个scanf读取k后,输入缓冲区中残留了换行符,导致第二个scanf读取字符串时可能无法正确读取。
- 循环右移的逻辑有误:当前代码将前lon-k个字符直接复制到b的开头,再将后k个字符复制到b的开头,这实际上变成了循环左移,且覆盖了之前复制的内容。
- 当k等于0时,第二个循环不会执行,但第一个循环会复制所有字符,结果正确;但当k不为0时,b数组的前k个位置会被后k个字符覆盖,导致输出错误。

- 检查输入读取方式,确保字符串能被正确读入。
- 重新思考循环右移的赋值逻辑:右移k位后,原字符串的第0个字符应该移动到b的哪个位置?