蓝桥杯 2011年第二届C语言初赛试题(1)

来源:互联网 发布:知名外汇交易商 知乎 编辑:程序博客网 时间:2024/06/09 20:34

轮换

串“abcd”每个字符都向右移位,最右的移动到第一个字符的位置,就变为“dabc”。这称为对串进行位移=1的轮换。同理,“abcd”变为:“cdab”则称为位移=2的轮换。

下面的代码实现了对串s进行位移为n的轮换。请补全缺失的代码。

void shift(char* s, int n)

{

char* p;

char* q;

int len = strlen(s);

if(len==0) return;

if(n<=0 || n>=len) return;

 

char* s2 = (char*)malloc(_________);

p = s;

q = s2 + n % len;

while(*p)

{

*q++ = *p++;

if(q-s2>=len)

{

*q = ___________;

q = s2;

}

}

strcpy(s,s2);

free(s2);

}

#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>using namespace std;void shift(char *s,int n){char *p;char *q;cout<<s<<endl;int len=strlen(s);if(n<=0 || n>=len)return ;char *s2=(char *)malloc((len+1)*sizeof(char));//分配len+1个空间p=s;q=s2+n%len;while(*p){*q++=*p++;if(q-s2>=len){*q='\0';q=s2;}}strcpy(s,s2);free(s2);}int main(){char s[10]="abcd";//数组存储字符串shift(s,2);cout<<s<<endl;return 0;}

注意:1、len=strlen(s),得到的是字符串s的字符个数,不包括结尾'\0',但是存储空间必须大于等于len+1才能完整存储字符串s,所以在分配同样大小的s2时要分配len+1个空间

    2、char s[10]="abcd",作者之前一直错误的写成char *s="abcd",运行结果一直是unhandled exception int  x:Access Violation,指针乱指。后来百度了一下strcpy百度百科才知道。


原创粉丝点击