在线编译器 C

#include <stdio.h> #include <string.h> int length(char *a) { char *start; start = a; while (*a != '\0') { a++; } int len = a - start; return len; } void copy(char from[], char to[]) { int i = 0; while (from[i] != '\0') { to[i] = from[i]; i++; } to[i] = '\0'; } void move(int a, char s[]) { int i = 0; int len = length(s); char s_move[len + 1]; while (s[i] != '\0') { if (i < a) { s_move[i] = s[len - a + i]; } else { s_move[i] = s[i - a]; } i++; } s_move[i] = '\0'; copy(s_move, s); printf("%s", s); } int main() { int x; char a[1001]; scanf("%d\n", &x); scanf("%[^\n]", a); move(x, a); return 0; }
这段代码实现了一个字符串循环右移的功能。`move`函数接收一个整数`a`和一个字符串`s`,将字符串`s`循环右移`a`个位置,然后打印结果。

代码中存在一个逻辑错误,导致循环右移的结果不正确。

- 在`move`函数中,当`i < a`时,你试图从字符串末尾取字符放到前面,但索引计算`s[len - a + i]`可能超出字符串范围,或者没有正确对应到右移后的位置。循环右移的正确思路是:原字符串中位置`i`的字符应该移动到新字符串的`(i + a) % len`位置,而不是你当前的分段处理方式。

- 另外,`int len = length(s);` 计算了字符串长度,但后面使用`len - a + i`时,如果`a`大于`len`,这个索引可能为负或超出范围。你需要考虑`a`可能大于字符串长度的情况,通常会对`a`取模`len`。