字符串的循环移位(左移) C语言
题目描述给定一个字符串长度为 nn 的字符串 s1 (10 < n < 10010<n<100) , 求出将字符串循环向左移动 k位的字符串 s2 (1 < k < n1<k<n) , 例如:字符串 abcdefghijk , 循环向左移动 33 位就变成 defghijkabc
输入描述
输入仅两行,第一行为左移的位数 k, 第二行为字符串 s1 .
输出描述
输出仅一行,为将字符串 s1 左移 k 位得到的字符串 s2 .
样例输入
Copy to Clipboard
3
abcdefghijk
样例输出
Copy to Clipboard
defghijkabc
问题:请问我的代码为什么没有结果
代码:
#include<stdio.h>
#include<string.h>
void inversion(char *p,int start,int end)
{
char temp;
while(start<end)
{
temp=p;
p=p;
p=temp;
++start;
--end;
}
}
void shift(char *p,int n)
{
int len=strlen(p);
n%=len;
inversion(p,0,n-1);
inversion(p,n,len-1);
inversion(p,0,len-1);
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
char ini_str;
int i=0;
for(i=0;ini_str!='\0';i++)
{
scanf("%s",&ini_str);
}
int len=strlen(ini_str);
shift(ini_str,n);
for(i=0;i<len;i++)
{
printf("%s\n",ini_str);
}
}
return 0;
}
字符串 abcdefghijk , 循环向左移动 33 位就变成 defghijkabc
不对吧,移动33位不还是原始字符串吗 #include <stdio.h>
char * shift(char s[] , int k)
{
int i , j , m ;
char c ;
for(m = 0 ; s ; m ++) ;
for(i = 0 ; i < k ; i ++) {
for(c = s , j = 1 ; j < m ; j ++) s = s ;
s = c ;
}
return s ;
}
int main(void)
{
char s ;
int k , n ;
scanf("%d" , & k) ;
fflush(stdin) ;
fgets(s , 104 , stdin) ;
for(n = 0 ; s ; n ++) ;
s = '\0' ;
printf("%s\n" , shift(s , k)) ;
} wp231957 发表于 2022-5-24 20:36
字符串 abcdefghijk , 循环向左移动 33 位就变成 defghijkabc
不对吧,移动33位不还是原始字符串吗
题目复制过来的时候出错了 是左移3位,不是33位(对不起!) 但是我想知道我的代码没有输出是什么原因造成的呢?看了好久也没头绪,可以帮我看看嘛(求求) PeterNzz 发表于 2022-5-24 20:41
题目复制过来的时候出错了 是左移3位,不是33位(对不起!) 但是我想知道我的代码没有输出是什么原因造 ...
我没看明白你的思路
你的第一个函数是逆置字符串(这个和移动有关系?)第二个函数就不知道是干啥的 #include <stdio.h>
#include <string.h>
void shiftLeft(char* str, int n) {
char t, * p;
int N = strlen(str);
for (int i = 0; i < n; ++i) {
t = (*str);
for (p = str; p < str + N - 1; ++p) (*p) = *(p + 1);
(*p) = t;
}
}
int main()
{
char str[] = "abcdefghijk";
shiftLeft(str, 3);
printf("%s", str);
return 0;
} 本帖最后由 jhq999 于 2022-5-24 21:20 编辑
void inversion(char *p,int len,int n,int isleft=1)
{
char temp1,temp2;
for (int i = 0,j=0,temp1=p; i < len; i++)
{
int k;
//if(isleft)k=j<n?len-n+j:j-n;
if(isleft)k=(len-n+j)%len
else
k=(j+n)%len;
temp2=p;
p=temp1;
temp1=temp2;
j=k;
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
char ini_str;
int i=0;
scanf("%s",ini_str);
int len=strlen(ini_str);
inversion(ini_str,len,n);
printf("%s\n",ini_str);
}
return 0;
}
页:
[1]