Онлайн компилятор C

#include<stdio.h> int num(char *s){ int sum=0; while(*s!='\0'){ sum++; s++; } return sum; } void same(char *s,int x){ int number=num(s); char b[1000]={0}; if(x<=number){ for(int i=0;i<number;i++){ if(i + x < number) b[(x+i)%number]=s[i]; else { b[(x+i)%x]=s[i]; } } } else { x=x%number; for(int i=0;i<number;i++){ if(i + x < number) b[x+i]=s[i]; else { b[(x+i)%x]=s[i]; } } } // for (int i=x;i<x+number;i++){ // printf("%c",b[i]); // } for (int i=0;i<number;i++){ s[i]=b[i]; } } int main(){ char m[1000]; int x; scanf("%d%s",&x,m); //num(m); same(m,x); printf("%s", m); return 0; }
这段代码试图实现一个字符串循环右移的功能,但存在逻辑错误。代码中 `num` 函数正确计算了字符串长度,`same` 函数试图将字符串 `s` 循环右移 `x` 位,但数组 `b` 的索引计算有误。

- 在 `same` 函数中,当 `x <= number` 时,`else` 分支的索引 `(x+i)%x` 是错误的。循环右移时,每个字符的新位置应该是 `(i + x) % number`,而不是根据 `x` 取模。这个错误会导致部分字符被错误放置。
- 当 `x > number` 时,代码用 `x = x % number` 取余是正确的,但后续的索引计算依然存在同样的问题:`else` 分支的 `(x+i)%x` 应该改为 `(x+i)%number`。

提示:
- 循环右移时,所有字符的新位置都统一用 `(i + x) % number` 计算,不需要分情况讨论。
- 检查 `else` 分支中的索引公式,确保它和 `if` 分支一样使用 `number` 取模。