Online Compiler 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; }
这段代码试图实现一个字符串循环右移的功能,将输入的字符串 `a` 向右移动 `k` 个位置后输出到 `b`。但代码中存在几个关键问题。

- 第一个循环中 `b[i+lon+1] = a[i]` 的索引计算有误,这会导致数组越界访问,因为 `b` 的大小只有1001,而 `i+lon+1` 可能远大于1000。
- 第二个循环将后半部分字符复制到 `b` 的开头,但第一个循环已经错误地占用了 `b` 的某些位置,导致最终输出结果混乱。
- 整体逻辑没有正确实现循环右移:应该将字符串分成两部分,后半部分移到前面,前半部分移到后面,但你的索引计算方式不对。

- 检查第一个循环的索引公式,思考如何将前半部分字符正确放到 `b` 的后半部分,而不是用 `i+lon+1` 这种可能越界的写法。
- 考虑使用取模运算来简化循环移位,或者先复制后半部分到 `b` 开头,再复制前半部分到 `b` 的剩余位置,注意两个部分的长度和起始位置。