C++ 复制字符串/字符数组

来源:互联网 发布:java高并发架构 编辑:程序博客网 时间:2024/06/06 02:17




题目

【项目1-小心地放开玩字符串/字符数组】

(2)读程序,请分析其实现的功能

[cpp] view plaincopyprint?
  1. #include<iostream>  
  2. using namespace std;  
  3. int main()  
  4. {  
  5.   char str1[50]="I am a happy boy\'s daddy.",str2[50];  
  6.   int i=0,j=0;  
  7.   for(i=0;str1[i]!='\0';i++)  
  8.   {    
  9.     if(str1[i]!=' ')  
  10.     {  
  11.       str2[j]=str1[i];  
  12.       j++;  
  13.     }  
  14.   }  
  15.   str2[j]='\0';//切记!!  
  16.   cout<<"整理后的字符串"<<str2<<endl;  
  17.   return 0;  
  18. }  
请自选下面有关字符串中字符统计的任务,完成两个即可。
  • 复制字符串str1,保存到str2中;
  • 在字符串str2后面增加符号"//comment:"
  • 将str1和str2接起来存放到str3中;
  • 将str1中的空格去除,仍保存在str1中;
  • 将str1和str2接起来,仍存放在str1中;
  • 去除str1中的多余空格(即两个单词中间仅保留一个空格)。
  • 在字符串前加5个符号"note:"

二、参考解答

1、复制字符串str1,保存到str2中

[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. #include<iostream>  
  2. using namespace std;  
  3. int main()  
  4. {   char str1[50]="I am a happy boy\'s daddy.",str2[50];  
  5.     int i,j;  
  6.     for(i=0,j=0;str1[i]!='\0';i++)  
  7.     {    
  8.         str2[j]=str1[i];  
  9.         ++j;  
  10.     }  
  11.     str2[j]='\0';//切记!!  
  12.     cout<<"整理后的字符串"<<str2<<endl;  
  13.     return 0;  
  14. }  

还可以写作:
[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. #include<iostream>  
  2. using namespace std;  
  3. int main()  
  4. {   char str1[50]="I am a happy boy\'s daddy.",str2[50];  
  5.     int i=0,j=0;  
  6.     for(i=0;str1[i]!='\0';)  
  7.     {    
  8.         str2[j++]=str1[i++];//注意下标处的写法  
  9.     }  
  10.     str2[j]='\0';//切记!!  
  11.     cout<<"整理后的字符串"<<str2<<endl;  
  12.     return 0;  
  13. }  

还可以写作:
[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. #include<iostream>  
  2. using namespace std;  
  3. int main()  
  4. {   char str1[50]="I am a happy boy\'s daddy.",str2[50];  
  5.     int i=0,j=0;  
  6.     while((str2[j++]=str1[i++])!='\0');//如此表达式!循环体为空  
  7.     cout<<"整理后的字符串"<<str2<<endl;  
  8.     return 0;  
  9. }  

怕被绕更迷糊了的,不要看下面的程序
[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. #include<iostream>  
  2. using namespace std;  
  3. int main()  
  4. {   char str1[50]="I am a happy boy\'s daddy.",str2[50];  
  5.     int i=0,j=0;  
  6.     while(str2[j++]=str1[i++]);  //其实和上面的程序等价  
  7.     cout<<"整理后的字符串"<<str2<<endl;  
  8.     return 0;  
  9. }  

2、在字符串str2后面增加符号"//comment:"

课堂上我提示找到str2的’\0’处,然后逐个赋值,太笨了。现在决定将要增加的字符串在程序中用一个字符串给出来,这是更能通用的办法。

[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. #include<iostream>  
  2. using namespace std;  
  3. int main()  
  4. {  
  5.     char str2[50];  
  6.     char str[20]={"//注释: 定义变量"};  
  7.     int i=0,j=0;  
  8.     cout<<"输入字符串:";  
  9.     gets(str2);  
  10.     while(str2[i]!='\0')  
  11.     {    
  12.         i++;          
  13.     }  
  14.     while(str[j]!='\0')  
  15.     {  
  16.         str2[i++]=str[j++];  
  17.     }  
  18.     str2[i]='\0';  
  19.     cout<<"--------------------------"<<endl;  
  20.     cout<<"处理后的字符串是: "<<str2<<endl;  
  21.     return 0;  
  22. }  
参考的运行结果



3、将str1和str2接起来存放到str3中;

[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. #include<iostream>  
  2. using namespace std;  
  3. int main()  
  4. {  
  5.     char str1[20]={"int i,a[100];"};  
  6.     char str2[20]={"//注释: 定义变量"};  
  7.     char str3[40];  
  8.     int i=0,j=0;  
  9.     while(str1[j]!='\0')  //复制str1  
  10.     {    
  11.         str3[i++]=str1[j++];  
  12.     }  
  13.     j=0;    //下面复制str2  
  14.     while(str2[j]!='\0')  
  15.     {  
  16.         str3[i++]=str2[j++];  
  17.     }  
  18.     str3[i]='\0';  //一定要保证str3中有'\0',否则"烫烫烫烫"  
  19.     cout<<"处理后的字符串是: "<<str3<<endl;  
  20.     return 0;  
  21. }  

4、将str1和str2接起来,仍存放在str1中

[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. #include<iostream>  
  2. using namespace std;  
  3. int main()  
  4. {  
  5.     char str1[40]={"I am a boy."};  
  6.     char str2[20]={"//注释: 废话一句"};  
  7.     int i=0,j=0;  
  8.     while(str1[i]!='\0')  //找到str1的结束  
  9.     {    
  10.         i++;  
  11.     }  
  12.     j=0;    //下面复制str2  
  13.     while(str2[j]!='\0')  
  14.     {  
  15.         str1[i++]=str2[j++];  
  16.     }  
  17.     str1[i]='\0';  //一定要保证str3中有'\0',否则"烫烫烫烫"  
  18.     cout<<"处理后的字符串是: "<<str1<<endl;  
  19.     return 0;  
  20. }  


5将str1中的空格去除,仍保存在str1中

策略不是去除空格,而是复制非空格字符,不复制空格,这样,空格挂了。
在现实中,迟到的员工罚款,是一种办法;还有一种做法,奖励按时到的员工,迟到的没有奖。都是奖勤罚懒。

[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. #include<iostream>  
  2. using namespace std;  
  3. int main()  
  4. {  
  5.     char str[40]={"I am a boy."};  
  6.     int i=0,j=0;  
  7.     while(str[j]!='\0')  //找到str的结束  
  8.     {    
  9.         if(str[j]!=' ')   
  10.             str[i++]=str[j++];  //如果str[i]不是空格,将复制  
  11.         else  
  12.             j++;    //str[j]为空格时,没有进行复制  
  13.                 //j++而没有i++,所以只要有空格,j的值一定会大于i的  
  14.                 //不管是否有空格,j一直勇往直前,i则遇空格就休息  
  15.     }  
  16.     str[i]='\0';    //str[i]处是复制结束后的位置  
  17.     cout<<"处理后的字符串是: "<<str<<endl;  
  18.     return 0;  
  19. }  

看下面的截图,理解程序。如果困难,自己单步执行观察一下。


6、去除str1中的多余空格(即两个单词中间仅保留一个空格)。

[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. #include <iostream>    
  2. using namespace std;    
  3. int main()    
  4. {   
  5.     char str[]="Only     one   space is    allowed    between   the    two  words.";   
  6.     cout<<"原始难看的句子:"<<str<<endl;  
  7.     int i=0,j=0;  
  8.     bool notSpace;  
  9.     while(str[j]==' ')//忽略开始的若干个空格  
  10.         j++;  
  11.     notSpace=true;     
  12.     while(str[j]!='\0')  
  13.     {  
  14.         if (str[j]!=' ')   
  15.         {  
  16.             notSpace=true;  
  17.             str[i++]=str[j++]; // 不是空格,复制     
  18.         }  
  19.         else if (notSpace)   //是空格,但目前是第一个(因为之前notSpace=true;的条件是遇非空格)  
  20.         {                  
  21.             notSpace=false;   //第一个空格仍然要复制  
  22.             str[i++]=str[j++];       
  23.         }  
  24.         else   //如遇第二个或更后的空格,正是由于遇到第一个空格并复制后,notSpace=false;的原因,会走到这儿  
  25.         {  
  26.             j++;   //不复制  
  27.         }  
  28.     }  
  29.     str[i]='\0';  
  30.     cout<<"整理后的句子是:"<<str<<endl;  
  31.     return 0;  
  32. }   

7、在字符串前加5个符号"note:"

[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. #include<iostream>  
  2. using namespace std;  
  3. int main()  
  4. {  
  5.     char str1[40]={"I am a boy."};  
  6.     char str2[20]={"note:"};  
  7.     int i=0,len2=0;  
  8.     //下面将把str2插入到str1的开头部分,并且保存在str1中  
  9.     //先求出str2的“长度”  
  10.     while(str2[len2]!='\0')  
  11.     {    
  12.         len2++;  
  13.     }     
  14.     //str2中有len2个字符  
  15.     //找到str1中结尾的位置  
  16.     i=0;      
  17.     while(str1[i]!='\0')  
  18.     {  
  19.         i++;  
  20.     }  
  21.     //由后往前,整体往后“搬迁”len2个位置  
  22.     while(i>=0)  
  23.     {  
  24.         str1[i+len2]=str1[i];  
  25.         i--;  
  26.     }  
  27.     //空出的前len2位置复制为str2  
  28.     i=len2-1;  
  29.     while(i>=0)  
  30.     {  
  31.         str1[i]=str2[i];  
  32.         i--;  
  33.     }  
  34.     cout<<"处理后的字符串是: "<<str1<<endl;  
  35.     return 0;  
  36. }  
0 0
原创粉丝点击