输入字符串和步数(正负)实现左旋右旋
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN 33
char *my_fgets(char *str,int n);
void movestr(char *str,int n);
int main(){
char arr[LEN]={0};
int move=0,ch=0;
for(fputs("输入字符串(NothingQuit):",stdout);my_fgets(arr,LEN-1);fputs("输入字符串(NothingQuit):",stdout)){
for(fputs("输入步数(0Quit):",stdout),ch=scanf("%d",&move);1;fputs("输入步数(0Quit):",stdout),ch=scanf("%d",&move)){
if(ch!=1||move>LEN-1||move<1-LEN){//正数为左旋,负数为右旋
while(getchar()!=10);
continue;
}
while(getchar()!=10);
if(!move)//当move为零时跳回一级循环,这个判断如果加在for中间会出现输入英文字符时move为零自动跳回一级循环的情况
break;
movestr(arr,move);
}
}
return 0;}
//
char *my_fgets(char *str,int n){
char *gets,*find;
if((gets=fgets(str,n,stdin))&&*gets!=10){
if(find=strchr(str,10))
*find=0;
else
while(getchar()!=10);
}
else
return 0;
return gets;}
void movestr(char *str,int n){
int len=strlen(str);
char temp[2]={0};
char *str1=str;
char *str_copy=(char *)calloc(len+1,sizeof(char));
strncpy(str_copy,str,len);
if(n>=0){
for(int i=0;i<n;i++){
temp[0]=str_copy[0];
strncpy(str_copy,str_copy+1,len-1);
strncpy(str_copy+len-1,temp,2);
}
printf("字符串\"%s\"左旋%d步后为\"%s\".\n",str,n,str_copy);
}
else{
n=abs(n);
for(int i=0;i<n;i++){
temp[0]=str_copy[len-1];
//strncpy(str_copy+1,str_copy,len);//这个实现不了,最后一位无法复制123456->612344
for(int j=len-1;j>0;str_copy[j]=str_copy[j-1],j--);
str_copy[0]=temp[0];
}
printf("字符串\"%s\"右旋%d步后为\"%s\".\n",str,n,str_copy);
}
free(str_copy);
}
|