C++之string学习笔记(1)

====================string类介绍====================

      在C++时代,由于诞生了类,出项了一种C++风格的字符串,也就是string型字符串。我们在调用string类来定义字符串的时候,我们必须在程序开头添加头文件:

#include <string>

      而且,由于string类存在于命名空间std中,这样一来,我们就必须使用

using namespace std;

  或者是使用

using std::string;

  才能访问到string类。string类的好处就是它在定义的时候隐藏掉了字符串的数组性质,因此在使用string类来定义一个字符串的时候我们不需要考虑如何将字符串放在数组中,因为string已经为我们做好了这一步。我们只需要想定义一个变量一样定义它就行了。我们可以这样说,由于string是一个类,那么C++就是运用string类的对象来保存字符串的,示例:

string str;

====================C++的string和C的char之比较==================== 

  • char类型的字符串无法直接进行比较,而string类则可以,程序示例;
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string str="初始化string型字符串";//初始化str
	char ch[]="初始化char型字符串";//初始化ch[]数组
	cout<<str<<endl;
	cout<<ch<<endl;
	//string示例
	cout<<"请输入“狗”的英文单词:"<<endl;
	cin>>str;
	if(str=="dog")
	{
		cout<<"狗:"<<str<<endl;
		cout<<str<<"的第一个字符是:"<<str[0]<<endl;
	}
	else
		cout<<"输入错误\n";
	//char示例
	cout<<"请输入“猪”的英文单词:"<<endl;
	cin>>ch;
	if(ch=="pig")
	{
		cout<<"猪:"<<ch<<endl;
		cout<<ch<<"的第一个字符是:"<<ch[0]<<endl;
	}
	else
		cout<<"输入错误\n";
	return 0;
}

  我们一运行程序会发现对于输入猪的英文pig,就算输入正确了程序还是会提示输入错误,原因就在于程序的第23行,由于数组ch[]的数组名ch所在的内存地址与“pig”所在的内存地址肯定不一样,那么无论如何都不会执行程序23行之后的if语句。有图为证:

      以上问题也不是没有解决方法的,只要我们利用循环的方式来比较数组ch中的每一个字符就可以了。这个check函数我们就不举例了哈,自己动手,丰衣足食嘛~~~我们还有一种很简单的方法来比较字符串,即采用:

strcmp(str1,str2)

  这个函数的运作机理很简单:

  • 假如str1<str2,则返回一个小于0的数字,如-1
  • 假如str1==str2,则返回0
  • 假如str1>str2,则返回一个大于0的数字,如1

      这样一来,我们就可以把程序的第23行改成:

if(strcmp(ch,"pig")==0)

  这样就对了,输出如下:

      但是值得说明的一点就是,虽然使用了strcmp函数简化了程序代码,但是在简化也不如string类的字符串,我们可以看到在程序的第13行,直接比较就行了。这是因为string类中的函数已经重载了比较运算符(==,>,<)。因此string类就允许使用运算符直接对他的字符串对象进行比较。

  • string型字符串可以直接赋值,而char不行。如果我们在程序中有下面这段话,则编译器肯定是会报错的:
    char a[]="Hello,C++";
    char b[]="Hello,Qt";
    a=b;
    

          原因就是我们不能把一个数组名直接赋给另外一个数组名,唯一能做的就是对数组元素进行逐个赋值。比如说:

    a[0]=b[0];
    a[1]=b[1];
    ...
    

          值得注意的一点是,同上面一样,虽然我们无法直接赋值,但是我们可以调用strcpy函数来实现赋值的目的:

    strcpy(str1,str2);
    

          这个函数的作用就是把str2中的字符依次复制给str1。值得注意的一点就是,在进行赋值之前,我们必须要保证str1足够大,以便能够容纳下str2中所有的字符串。所以有了这个函数,我们就可以把上面的程序改一下,把a=b改成strcpy(a,b);就可以了。而如果我们采用string类就不会出现上诉麻烦,因为string类重载了运算符=,这就是的对象之间可以直接赋值。程序和输出如下图所示:

  •  string型字符串可以直接合并,但是char型的字符串却不能直接合并,必须用到strcat函数:

    strcat(str1,str2);
    

          strcat是string catenate的缩写。它的作用就是将第2个字符串合并到第1个字符串中。因此,第1个字符串必须保证能够容纳下两个字符串的长度。针对这一点,我们来看如下这个程序:

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	char a[]="Hello,C++";
    	char b[]="Hello,Qt";
    	strcat(a,b);
    	cout<<a<<endl;
    	cout<<b<<endl;
    }
    

          我们一运行程序就崩溃了,产生如下图所示的错误。这就是因为我们在初始化的编译器自动为数组a设定了长度,为10个字符长(注意,包括‘\0’),而数组b的长度为9个字符长。但是在程序的第8行调用strcat函数的时候,由于b的9个字符长超出了a所能容纳的字符长度,而去修改了其他地址的数据,这样程序自然而然就崩溃了。

          要想避免这个错误,我们就必须自定义数组a所能容纳的最大的大小。反映在程序里面,我们就把程序的第6行修改为:

    char a[20]="Hello,C++";
    

    而如果我们使用string类的对象来实现两个字符串合并,就不会产生上诉烦恼,因为string类已经重载了+运算符,示例与输出结果:


          通过这两个简单的例子之间的对比,我们可以很明显地看出来,C++字符串的合并比C语言的字符串合并更加方便有效,而且不易发生错误。

      学习笔记1 到此结束,^_^......




 

posted @ 2011-07-28 17:47  uniqueliu  阅读(16901)  评论(5编辑  收藏  举报