分享

C 之string学习笔记(1)

 My镜像站 2011-12-26

====================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类则可以,程序示例;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#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不行。如果我们在程序中有下面这段话,则编译器肯定是会报错的:
    1
    2
    3
    char a[]="Hello,C++";
    char b[]="Hello,Qt";
    a=b;

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

    1
    2
    3
    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个字符串必须保证能够容纳下两个字符串的长度。针对这一点,我们来看如下这个程序:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #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 到此结束,^_^......


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多