在线编译器 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)%number]=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`函数根据输入的移动位数`x`将字符串中的字符重新排列到临时数组`b`中,最后复制回原字符串。

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

- 在`same`函数中,当`x <= number`时,`else`分支里的`b[(x+i)%x]`是错误的。这个表达式在`i+x >= number`时使用,但`(x+i)%x`实际上等于`i%x`,这会导致字符被错误地映射到数组的前`x`个位置,而不是正确的位置。你需要重新考虑当索引超出范围时,应该映射到哪个位置。

- 当`x > number`时,你用了`x = x % number`,但之后又重复了与上面相同的逻辑,这里同样存在映射错误的问题。实际上,取模后`x`已经小于`number`,可以直接使用统一的映射公式,不需要分情况讨论。