在线编译器 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}; 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`函数试图将字符串`s`循环右移`x`位,但内部的索引计算有误。

- 在`same`函数中,当`i + x >= number`时,你使用了`b[(x+i)%x]`,这会导致索引范围错误。循环右移时,所有目标索引都应该在`0`到`number-1`之间,而`(x+i)%x`的结果只在`0`到`x-1`之间,当`x`小于`number`时,会丢失部分字符。
- 循环右移的正确思路是:将原字符串的每个字符`s[i]`放到新位置`(i + x) % number`上,这个公式对所有`i`都适用,不需要分情况讨论。