在线编译器 C

#include <stdio.h> int main() { int k, len = 0; char s[1001] = {0}, b[1001] = {0}; scanf("%d", &k); scanf("%s", s); for (int i = 0; s[i] != '\0'; i++) { len++; } if (k > len) { printf("%d", k % len); return 0; } int size = k; for (int i = 0; s[i] != '\0'; i++) { if (k != 0) { b[i] = s[len - k]; k--; } else { b[i] = s[i - size]; } } for (int i = 0; b[i] != '\0'; i++) { printf("%c", b[i]); } return 0; }
这段代码试图实现一个字符串循环右移k位的功能,但存在逻辑错误。代码先计算字符串长度len,然后处理k大于len的情况(输出k%len后直接结束程序),接着尝试将s的字符按规则复制到b中。

- 当k大于len时,程序直接输出k%len并结束,这不符合循环右移的预期行为。循环右移应该将字符串整体移动,而不是输出一个数字。
- 在复制字符时,b[i] = s[len - k] 这一行中,k在循环中递减,但len - k会随着k变化而改变索引,导致取到的字符位置混乱。同时,当k减到0后,b[i] = s[i - size] 中的i - size可能为负数,造成数组越界访问。

建议你重新思考循环右移的实现方式:先处理k大于len的情况(用k %= len),然后考虑如何将字符串的后k个字符移到前面,其余字符依次后移。注意数组索引不能为负。