程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 藍橋杯 2011年第二屆C語言初賽試題(1)

藍橋杯 2011年第二屆C語言初賽試題(1)

編輯:C++入門知識

輪換

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

 


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved