C++第16周项目1(2)复制字符串/字符数组

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565

题目

【项目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中

#include<iostream>
using namespace std;
int main()
{	char str1[50]="I am a happy boy\'s daddy.",str2[50];
	int i,j;
	for(i=0,j=0;str1[i]!='\0';i++)
	{
	    str2[j]=str1[i];
		++j;
	}
	str2[j]='\0';//切记!!
	cout<<"整理后的字符串"<<str2<<endl;
	return 0;
}

还可以写作:

#include<iostream>
using namespace std;
int main()
{	char str1[50]="I am a happy boy\'s daddy.",str2[50];
	int i=0,j=0;
	for(i=0;str1[i]!='\0';)
	{
	    str2[j++]=str1[i++];//注意下标处的写法
	}
	str2[j]='\0';//切记!!
	cout<<"整理后的字符串"<<str2<<endl;
	return 0;
}

还可以写作:

#include<iostream>
using namespace std;
int main()
{	char str1[50]="I am a happy boy\'s daddy.",str2[50];
	int i=0,j=0;
	while((str2[j++]=str1[i++])!='\0');//如此表达式!循环体为空
	cout<<"整理后的字符串"<<str2<<endl;
	return 0;
}

怕被绕更迷糊了的,不要看下面的程序

#include<iostream>
using namespace std;
int main()
{	char str1[50]="I am a happy boy\'s daddy.",str2[50];
	int i=0,j=0;
	while(str2[j++]=str1[i++]);  //其实和上面的程序等价
	cout<<"整理后的字符串"<<str2<<endl;
	return 0;
}

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

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

#include<iostream>
using namespace std;
int main()
{
	char str2[50];
	char str[20]={"//注释: 定义变量"};
	int i=0,j=0;
	cout<<"输入字符串:";
	gets(str2);
	while(str2[i]!='\0')
	{
		i++;
	}
	while(str[j]!='\0')
	{
		str2[i++]=str[j++];
	}
	str2[i]='\0';
	cout<<"--------------------------"<<endl;
	cout<<"处理后的字符串是: "<<str2<<endl;
	return 0;
}

参考的运行结果

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

#include<iostream>
using namespace std;
int main()
{
	char str1[20]={"int i,a[100];"};
	char str2[20]={"//注释: 定义变量"};
	char str3[40];
	int i=0,j=0;
	while(str1[j]!='\0')  //复制str1
	{
		str3[i++]=str1[j++];
	}
	j=0;    //下面复制str2
	while(str2[j]!='\0')
	{
		str3[i++]=str2[j++];
	}
	str3[i]='\0';  //一定要保证str3中有'\0',否则"烫烫烫烫"
	cout<<"处理后的字符串是: "<<str3<<endl;
	return 0;
}

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

#include<iostream>
using namespace std;
int main()
{
	char str1[40]={"I am a boy."};
	char str2[20]={"//注释: 废话一句"};
	int i=0,j=0;
	while(str1[i]!='\0')  //找到str1的结束
	{
		i++;
	}
	j=0;    //下面复制str2
	while(str2[j]!='\0')
	{
		str1[i++]=str2[j++];
	}
	str1[i]='\0';  //一定要保证str3中有'\0',否则"烫烫烫烫"
	cout<<"处理后的字符串是: "<<str1<<endl;
	return 0;
}


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

策略不是去除空格,而是复制非空格字符,不复制空格,这样,空格挂了。

在现实中,迟到的员工罚款,是一种办法;还有一种做法,奖励按时到的员工,迟到的没有奖。都是奖勤罚懒。

#include<iostream>
using namespace std;
int main()
{
	char str[40]={"I am a boy."};
	int i=0,j=0;
	while(str[j]!='\0')  //找到str的结束
	{
		if(str[j]!=' ')
			str[i++]=str[j++];  //如果str[i]不是空格,将复制
		else
			j++;    //str[j]为空格时,没有进行复制
				//j++而没有i++,所以只要有空格,j的值一定会大于i的
				//不管是否有空格,j一直勇往直前,i则遇空格就休息
	}
	str[i]='\0';    //str[i]处是复制结束后的位置
	cout<<"处理后的字符串是: "<<str<<endl;
	return 0;
}

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

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

#include <iostream>
using namespace std;
int main()
{
	char str[]="Only     one   space is    allowed    between   the    two  words.";
	cout<<"原始难看的句子:"<<str<<endl;
	int i=0,j=0;
	bool notSpace;
	while(str[j]==' ')//忽略开始的若干个空格
		j++;
	notSpace=true;
	while(str[j]!='\0')
	{
		if (str[j]!=' ')
		{
			notSpace=true;
			str[i++]=str[j++]; // 不是空格,复制
		}
		else if (notSpace)   //是空格,但目前是第一个(因为之前notSpace=true;的条件是遇非空格)
		{
			notSpace=false;   //第一个空格仍然要复制
			str[i++]=str[j++];
		}
		else   //如遇第二个或更后的空格,正是由于遇到第一个空格并复制后,notSpace=false;的原因,会走到这儿
		{
			j++;   //不复制
		}
	}
	str[i]='\0';
	cout<<"整理后的句子是:"<<str<<endl;
	return 0;
} 

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

#include<iostream>
using namespace std;
int main()
{
	char str1[40]={"I am a boy."};
	char str2[20]={"note:"};
	int i=0,len2=0;
	//下面将把str2插入到str1的开头部分,并且保存在str1中
	//先求出str2的“长度”
	while(str2[len2]!='\0')
	{
		len2++;
	}
	//str2中有len2个字符
	//找到str1中结尾的位置
	i=0;
	while(str1[i]!='\0')
	{
		i++;
	}
	//由后往前,整体往后“搬迁”len2个位置
	while(i>=0)
	{
		str1[i+len2]=str1[i];
		i--;
	}
	//空出的前len2位置复制为str2
	i=len2-1;
	while(i>=0)
	{
		str1[i]=str2[i];
		i--;
	}
	cout<<"处理后的字符串是: "<<str1<<endl;
	return 0;
}
时间: 2024-09-12 12:30:02

C++第16周项目1(2)复制字符串/字符数组的相关文章

2013-C++第16周项目参考解答链接集

课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759 [项目2-指来指去]设计一个程序,利用指针完成下面的工作(1)下面的程序,输入10 100和100 10,均可以输出max=100 min=10,请补充完整程序 #include <iostream> using namespace std; int main( ) { int *p1,*p2,a,b,t; cin>>a>>b; p1=&

C++第16周项目1(1)统计字符串/字符数组

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 题目 [项目1-小心地放开玩字符串/字符数组] (1)读程序,请分析其实现的功能 [cpp] view plaincopyprint? #include<iostream>   using namespace std;   int main()   {     char str[50];     int i=0,n=0;     cout<<"输入

2014秋C++第16周 项目 指针和数组、函数

课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂"贺老师课堂"同步展示,使用的帐号请到课程主页中查看.  [项目1-数组的排序]按给定部分程序的要求,用指向数组的指针变量作为形式参数编写函数,完成排序.重点体会:(1)排序算法,可以是冒泡,也可以是选择:(2)用指向数组的指针变量作为形式参数,用数组名(即数组的地址)作为实际参数,函数中对于形参的改变实质上也就是对实参对应内存单元的改变:(3)形

C++第16周项目2——带姓名的成绩单(字符数组版)

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 [项目2-带姓名的成绩单(字符数组版)](参考15周项目3)设score数组中存储同学们的C++成绩,增加一个数组char name[][20]并赋初值,表示同学们的姓名(注意:本周不使用更方便的string类).这两个数组中,同学的姓名与成绩的下标保持一致(例如name[1]和score[1]表示同一位同学的姓名和C++成绩).请(1)输出按成绩排序后的同学的名单:(2

2014秋C++第16周 项目2参考 用指针玩字符串

课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂"贺老师课堂"同步展示,使用的帐号请到课程主页中查看.  [项目2-用指针玩字符串] 指针是神奇的,指向整型的指针int *p1,可以操作整型数组int a[]:指向字符型的指针char *p2,可以操作字符数组(字符串)char str[]:更灵活的是,在函数的传递中,指针.数组名在一定程度上可以互换.请编制函数,对字符串的进行各种操作. 序 功

2014秋C++第16周 项目4参考 为动态数组扩容

课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂"贺老师课堂"同步展示,使用的帐号请到课程主页中查看.  [项目4-为动态数组扩容] 下面的程序,利用动态数组保存学生的成绩.当再有一批学生成绩需要保存时,要为之扩容(和吃自助一样,用多少,取多少,这好),请补充完整下面的程序,实现如图所示的功能. int main( ) { int num,i,addNum; //num是小组人数 cout<

C++第16周项目4 -处理C++源代码 - (1)有没有main函数?

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijian/article/details/9078413 [项目4]写处理C++源代码的程序 (1)读入一个C++程序,判断其中是否只有一个main()函数,输出"暂时没有发现问题",或者"没有main()函数",或者"不能定义多个main()函数": 提

C++第16周项目4 -处理C++源代码 - (3)自动加注释

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijian/article/details/9078413 [项目4]写处理C++源代码的程序 (3)读入一个C++程序,输入m.n两个数字,从第m行起的n行代码将作为注释使用(即在这些行前面加上"//"),新程序保存到另一个.cpp文件中,并在屏幕上显示处理过的程序,显示时加上行号. 参考解答:

C++第16周项目4 -处理C++源代码 - (2)花括号单独占一行

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijian/article/details/9078413 [项目4]写处理C++源代码的程序 (2)读入一个C++程序,使程序中的所有左花括号"{"和右花括号"}"都单独占一行,新程序保存到另一个.cpp文件中,并在屏幕上显示处理过的程序,显示时加上行号. 参考解答: #in