Онлайн компилятор 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 k, char s[]) { int i = 0; int len = length(s); char s_move[len + 1]; int a = k % len;// 0 <= k <= 1000000 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; }
这段代码实现了一个字符串循环右移的功能。它先读取一个整数x和一个字符串a,然后将字符串a循环右移x个位置并输出结果。

代码中定义了几个函数:length用于计算字符串长度,copy用于复制字符串,move是核心函数,负责执行循环右移操作。在move函数中,它先计算有效移动步数(取模),然后创建一个临时数组s_move,根据移动规则将字符填入正确位置,最后用copy函数将结果复制回原数组并输出。

- 注意move函数中临时数组s_move的大小声明为len+1,这在C99标准中是合法的变长数组,但需要确保len的值有效。如果输入字符串长度超过1000,可能会出现问题,因为主函数中数组a的大小固定为1001。

- 循环右移的逻辑需要仔细检查:当i < a时,从s[len - a + i]取字符;否则从s[i - a]取字符。这个公式是否正确实现了右移操作?建议用简单例子(如字符串"abcde",k=2)手动模拟验证。