在线编译器 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+lon-1] = 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个位置。但代码中存在几个问题。

首先,第一个循环中 `b[i+lon-1]` 这个索引计算有误。当 `i` 从0开始时,`i+lon-1` 会从 `lon-1` 开始,而不是从正确的位置开始存放字符。这会导致数组越界或覆盖错误的位置。

其次,第二个循环中 `b[j]` 从索引0开始存放后半部分字符,但第一个循环已经占用了 `b` 数组的某些位置,两者可能会冲突。

- 检查第一个循环的索引计算,思考循环右移时前半部分字符应该放到 `b` 的哪个位置。
- 注意 `b` 数组的索引范围是0到lon-1,确保所有赋值都在这个范围内。