Online Compiler 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) { k = k % len; } 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; }
这段代码试图实现一个字符串的循环右移功能,将字符串s循环右移k位后存入b并输出。但代码中存在逻辑错误,导致结果不正确。

代码的主要思路是:先计算字符串长度len,如果k大于len则取模。然后通过一个循环,将s中从末尾开始的k个字符复制到b的前k个位置,再将剩余字符从s开头复制到b的后面部分。

- 问题在于循环中的索引计算。当k不为0时,你使用s[len - k]来取字符,但每次循环k都会递减,导致取到的字符位置不断变化,而不是固定从末尾取k个字符。这会让取出的字符顺序混乱。
- 当k变为0后,你使用s[i - size]来取字符,但这里的i是当前循环的索引,而size是初始的k值。这个索引计算可能越界或取错位置,因为i从0开始,i - size可能是负数,导致访问数组越界。

提示:
- 思考一下:循环右移k位后,新字符串中每个位置i的字符应该来自原字符串的哪个位置?可以用一个公式来表示这个映射关系,而不是分两段处理。
- 注意数组索引不能为负数,确保所有访问都在0到len-1范围内。