当前位置:编程学习 > C/C++ >>

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

轮换

串“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);

}


[cpp]
#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; 

#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百度百科才知道。

 


 

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,