在线编译器 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++){ b[(x+i)%number]=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]; } s[number]="\0"; } int main(){ char m[1000]; int x; scanf("%d%[^\n]",&x,m); //num(m); //fgets(m,sizeof(m),stdin); //char c; // false skip //int now=-1; // while((c=getchar())!=EOF && c!='\n'){ //m[++now]=c; //} same(m,x); printf("%s", m); return 0; }
这段代码试图实现一个字符串循环右移的功能,但存在几个问题。

代码中的 `num` 函数正确计算了字符串长度。`same` 函数试图将字符串循环右移 `x` 位,但最后一行 `s[number]="\0"` 是错误的,因为 `"\0"` 是字符串字面量,不能直接赋值给字符变量,应该用 `'\0'`。

`main` 函数中的 `scanf` 格式 `"%d%[^\n]"` 有问题:`%d` 读取整数后,`%[^\n]` 会读取剩余的所有字符,包括换行符前的空格,导致字符串开头可能包含空格。而且 `%[^\n]` 不会跳过前导空白,所以输入 "3 hello" 时,`m` 会得到 " hello"(带前导空格)。

- 检查 `same` 函数最后一行:`s[number]="\0"` 中 `"\0"` 是字符串,应该用字符 `'\0'`。
- 检查 `scanf` 的格式:`%d%[^\n]` 不会跳过 `%d` 后的空白,导致字符串开头可能有多余空格。考虑用 `%d %[^\n]`(加一个空格)或者先用 `getchar` 吃掉换行。