在线编译器 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]; } } 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; }
Этот код пытается сдвинуть символы строки влево на `x` позиций циклически. Функция `num` считает длину строки, `same` выполняет сдвиг, записывая результат во временный массив `b`, а затем копирует обратно.

- В `scanf` порядок аргументов неверный: сначала считывается число, потом строка, но формат `%d%[^\n]` ожидает, что строка начнется сразу после числа, а перед ней может остаться символ новой строки. Это приводит к тому, что строка считывается пустой или с лишним символом.
- В функции `same` после сдвига вы копируете `b` обратно в `s` без учета того, что `b` содержит символы, сдвинутые по формуле `(x+i)%number`, но затем вы просто копируете `b[0..number-1]` в `s`. Это работает, только если сдвиг выполнен корректно, но проблема ввода может испортить результат.