输入一个字符串和一个非负整数N,要求将字符串循环左移N次。
输入格式:
输入在第1行中给出一个不超过100个字符长度的、以回车结束的非空字符串;第2行给出非负整数N。
输出格式:
在一行中输出循环左移N次后的字符串。
输入样例:
Hello World!
2
结尾无空行
输出样例:
llo World!He
结尾无空行
备注版:
#include<stdio.h>
#include <string.h>//string函数用于处理字符串
int main (){
char s1[101];
char s2[101];
char s3[101];
gets(s1);
strcpy(s2,s1);//strcpy,把s1字符复制到s2上
int n,m,len1,i,j;
len1=strlen(s1);
scanf("%d",&n);
while(1){
if(n>len1){
n=n-len1;//当这个n大于输入字符串本身的时候,一个字符长度就是一个周期
}else break;
}
for(i=0,j=0;i<n;i++,j++){
s3[i]=s1[j];//把前面要消除的字符记录下来,为后面strcat作准备
}
for(i;i<100;i++){
s3[i]='\0';//要将多余的去掉,并且使后面的数组都为0
}
for(i=0,j=n;j<len1;i++,j++){
s1[i]=s1[j];//通过后移的方法消除掉前面n个字符
}
for(i;i<100;i++){
s1[i]='\0';//s1后面的数组都为0,为后面strcat做准备,不然没有\0这个结束符,strcat会出现乱码
}
strcat(s1,s3);//s1和s3无缝衔接
puts(s1);
return 0;
}
纯净版:
#include<stdio.h>
#include <string.h>
int main (){
char s1[101];
char s2[101];
char s3[101];
gets(s1);
strcpy(s2,s1);
int n,m,len1,i,j;
len1=strlen(s1);
scanf("%d",&n);
while(1){
if(n>len1){
n=n-len1;
}else break;
}
for(i=0,j=0;i<n;i++,j++){
s3[i]=s1[j];
}
for(i;i<100;i++){
s3[i]='\0';
}
for(i=0,j=n;j<len1;i++,j++){
s1[i]=s1[j];
}
for(i;i<100;i++){
s1[i]='\0';
}
strcat(s1,s3);
puts(s1);
return 0;
}
string函数
strcat:无缝衔接两个数组,后者接到前者后面,后者只占前者的一个位置
strcpy:把后面的数组复制到前面去,如果前面数组有字符串,会覆盖掉
strstr:根据后面的数组,找前面数组的子串,如果有,找到的子串是带着后面所有字符串的。
比如 strstr(s1,s2)
s1:hello world!
s2: llo
strstr后puts(s1)是llo world!而不只是llo
要用一个新数组来存放,搬运之前的字符串数组,记得把新数组全部给弄成'\0';
c++超级简单写法:
利用string里面的substr找字符串的函数:
代码;
#include<iostream>
using namespace std;
int main(){
string s1;
int n;
getline(cin,s1);//输入有空格,cin遇到空格结束,所以要用cin;
cin>>n;
n=n%s1.length();//可能有n大于字符长度的情况;
cout<<s1.substr(n)<<s1.substr(0,n);//s.substr(a,b),a指首地址,b指的是长度;
//s.substr(a),a指的是首地址,从首地址开始一直到结束;
return 0;
}
substr永远滴神;