用c语言输出一个整数n和一字符串,将字符串循环左移n个字符

如题所述

使用带头结点的环形链表存储字符串,从链表头开始做N次L->next=L->next->next;L=L->next;此时记录N=L;并输出链表内容(注意跳过头结点,头结点无字符信息),直至L==N;
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-10-31
不用这么复杂,你用模运行符(%)就可以,不用再复制的:
算法如下
字符串: s ="abcdefghijklmn";
左移量: n = 10;

输出:
int i,j=strlen(s);
for(i=n; i<j+n; i++)
prinft("%c", s[ i%j ] );
第2个回答  2011-10-31
我先讲一下我的算法,要是有需要我可以写写看。
就用牺牲空间的方法,将这个数组复制。再直接截取。
例如字符串为abcdefghijklmn要循环左移10位。
1。先复制得到abcdefghijklmnabcdefghijklmn。
2。直接从第十位开始往后取字符串的长度位就是结果。abcdefghij klmnabcdefghij klmn。
中间那段就是了。追问

希望写一下谢谢

追答

那你是希望最后得到一个目标数组里面是结果是么?

追问

我想看看编程的过程谢谢

追答

大概写了一下,但是请自己注意一下字符串的边界问题,我完全没有处理。只是提前声明了200的char数组,要是输入的字符串长于99了,就会出错了。
楼主还可以看看3楼的意见,看看你具体什么需求。
#include
#include

int main()
{
printf( "请输入目标字符串和想移动的位数 例如 abcd 1,用空格隔开\n" );

char a[200];
int n;
scanf("%s %d",&a,&n);

int len = strlen(a);

for(int i = 0;i<len;i++)
{
a[len+i] = a[i];
}

//output
n = n%len;
for(int i = n;i<len+n;i++)
{
printf("%c",a[i]);
}

return 0;
}

本回答被提问者采纳

...s[],int n),函数的功能将字符串s循环左移n个字符。编写主函数,输入...
} void main(void){ char arry[201];int n;printf("Type a string...\\nStr=");gets(arry);printf("To shift to the left several?\\nn=");scanf("%d",&n);leftn(arry,n);printf("%s\\n",arry);}

如何用c语言实现循环左移
循环左移n: (a>>(N-n))|(a>>n)循环右移n: (a<<(N-n))|(a>>n)C语言的位运算功能是其区别于其他大多数高级程序设计语言的特色之一,用它可以方便实现一些特殊功能,灵活掌握是用C程序编写系统程序的基础。

用C语言编写一个循环左移移位
以无符号整型为例:unsigned int func(unsigned int n){ unsigned int v=n&(1<<(sizeof(unsigned int)-1)); n<<=1; if(v) n|=1; return n;}

c语言 循环左移
void fun(int *a,int n,int x) { int i,j,k;for ( i=0;i<x;i++ ) { k=a[0]; for ( j=0;j<n-1;j++ ) a[j]=a[j+1]; a[n-1]=k; } } void main() { int a[N],i,x;printf("Enter %d integers: ",N); for ( i=0;i<N;i++ ) scanf("%d",&a[i...

C语言:写一个函数用来实现左右循环移位。
void fun(int &value,int n,int dire){ if(dire==0) return;int x=1<<(sizeof(int)*8-1);int temp;int i;if(dire>0){ for(i=0;i<n;i++){ temp=value&1;value>>=1;if(temp) value|=x;} } else { for(i=0;i<n;i++){ temp=value & x;value<<=1;if(temp) ...

c语言中 (n & 1)什么意思啊
说明:%1f或者%10f,里面的数字指的是最小域宽限定符,简单的说即数值输出后要有多少个字符。 %1f保证输出的数至少有1个字符位 ,%10f表示输出的数至少是10位,如果不够10个字符,默认填充的是空格,程序员可以自己设置用什么填充。比如下面的代码当输出的字符不够10个时用0进行填充:include<stdio...

C语言问题 怎么实现一个数组循环左移
其实很简单,将第一个比如a[0]用一个变量保存,然后将后一个元素的值赋给前一个,最后将保存a[0]的变量的值赋给最后一个元素,循环 。对于一个数组,应该用双重循环实现,外循环代表你需要左移的次数,内循环即将每一个元素左移

C语言数组的左移函数
\/\/下面是将数组左移的函数void fun(char *a, int *length)\/\/length为字符串a的长度{ for(int i = 0; i < length - 2; i++) { a[i] = a[i+2]; }*length = (*length) - 2; } \/\/如果只是输出左移两位的结果,可以用下面这个函数void fun(char *a, int length){ for(int...

用c语言编写一程序,接收从键盘上输入的整数i,将数组循环左移i位
{ int a[10]={1,2,3,4,5,6,7,8,9,10},b[10];int i,j,k;printf("移位前: ");for(k=0;k<10;k++)printf("%d ",a[k]);printf("\\n");printf("Input i: ");scanf("%d",&i);j=i%10;for(k=0;k<10;k++){ if(j==10)j=0;b[k]=a[j++];} for(k=0;k<10...

...个c语言程序,功能将10个整数元素数组的值循环左移4次
int a_end,s,*b,g;for(s=0;s<=n;s++)a_end=*(r+9);for(b=r+9;b>=r;b--)b=*(r-1);r=a_end;} int main(){ int a[10],i;int * p;p = a;void vet(int *,int);printf("please input ten size");for(i=0;i<10;i++)scanf("%d\\n",&a[i]);vet(p,4);...

相似回答