我是靠谱客的博主 兴奋金针菇,最近开发中收集的这篇文章主要介绍C风格字符串和C++string类对比 使用实例 一.C风格字符串 二.标准的C++string类,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一.C风格字符串

◆ 1、字符串定义

  字符串是用字符型数组存储的,字符串要求其尾部以’’作为结束标志。如:

    char string[ ]=”C++ programming language”;
用sizeof来测string长度为25个字节,而实际串本身长度(含空格)为24个字节,多出来的一个就是串结束符’’(含0)。

◆ 2、指针与字符串

    char *pstr=”C++ is a object_oriented language”;
这里绝不是建立了一个字符串*pstr,并用赋值号后的字符串常量给它赋初值。而是编译器将字符串常量“C++ is a object language”的第一个字符的存储地址赋给字符指针作初值。字符串常量是放在字符串常量区中,它不属于指针pstr,反过来是pstr依附于它。

用指针输出字符串:C++不对数组的边界进行检测,但字符串有一个结束符’’(全0),在程序运行时是可以知道实际串长度的。设有定义int a[10],如有语句:
    cout<<a<<endl;
则打印出a数组在内存中的首地址,一个16进制的数。

◆ 3、字符串处理函数

C++标准库有很多字符串处理函数,在头文件 <cstring> 中。

1)字符串复制函数:

    char *strcpy(char *s,const char ct)
返回值是指向复制后字符串中首字符的指针。

【例5.10】字符串复制函数 strcpy()。( 查看源码

2)串连接函数:char *strcat(char *s,const char *ct)

将串ct复制到串s的后面,形成一个长串。例如:
    char str1[30]=“张成”;
    char str2[20]=“是电子系的学生”;
    strcat(str1,str2);
结果是str1中放的是“张成是电子系的学生”。

3)字符串比较函数:int strcmp(const char *cs,const char ct)。

两字符串比较是按字典排序方法进行。两个字符串从第一个字符比较起,如果相同,则比较第二个字符,依此类推,直到不同。哪个字符串对应的字符的ASCII码值大,串就大。如果两串直到结束符都相同,则一样大。若两个字符串相等,则返回0;串cs 大,则返回正整数;串ct大,则返回负整数。
该函数也可很简洁地表达如下:
    int strcmp(const char *cs,const char *ct){
        int k;
        while((k= *cs - * ct)== 0 && *cs++ && *ct++);
    //注意*cs++和*ct++是条件判断后才++的
        return k;
    }

4)求字符串长度函数:int strlen(const char *s)

这里求出的串长度不包含串结束符在内。而 sizeof 运算符包括结束符,还包括没有使用的单元。

◆ 4、void指针及应用:称无类型或泛型指针。

任何类型的指针都可以赋给void类型的指针变量,例如:
    int val=5;
    int *pi=&val; //必须为指针赋一个有效地址,才能引用指针
    void *pv=pi;
但反过来,将泛类型指针赋给其他类型指针必须使用强制类型转换: pi=(int *)pv;

【例5.11】将字符指针强制转换为泛型指针输出字符串地址。 
#include<iostream>
using namespace std;
int main(){
  char *string1="欢迎学习C++程序设计课程!";
  cout<<"串值是:"<<string1<<"n串地址是:"<<(void*)string1<<endl;
  return 0;
}

二.标准的C++string类

◆ 1、包含头文件

建议使用C++的string类,它重载了运算符,连接、索引和复制等操作不必使用函数,使运算更加方便,而且不易出错。string类包含在名字空间std中的头文件<string>。

    #include<string>
    using namespace std;

◆ 2、string类的使用方法

(1) string类有三个构造函数:

    string str; //调用默认的构造函数,建立空串
    string str("OK"); //调用采用C字符串初始化的构造函数
    string str(str1); //调用复制构造函数,str是str1的复制
可以对字符串变量中某一字符进行操作,如:
    string word=″Then″;  //定义并初始化字符串变量word
    word[2]=′a′;  //修改序号为2的字符,修改后word的值为″Than″

(2) string类字符元素的访问比C字符串有所增强:

    str[i] //返回str中索引i处字符的引用,不查是否出界
    str.at(i) //返回str中索引i处字符的引用,查是否出界

(3) string类重载了一些运算符,特别注意当目标串较小,无法容纳新的字符串,系统会自动分配更多的空间给目标串,不必顾虑出界:

    str1=str2; //str1成为str2的代码
    str1+=str2; //str2的字符数据连接到str1的尾部
    str1+str2; //返回一个字符串,它将str2连接到str1的尾部
    str1==str2; str1!=str2; //比较串是否相等,返回布尔值
    str1<str2; str1>str2; str1<=str2; str1>=str2;
    //基于字典序的比较,返回布尔值

(4) string类的输入输出。

输出与C风格字符串同样方便,使用插入运算符<<和cout。输入如用提取运算符>>,代码读取的是以空白字符结束的字符串,输入完整的字符串可用非成员函数getline,注意格式:
    getline(cin,str); //串以’n’结束
    getline(cin,str,ch); //串以ch结束

(5) string类有一些常用的成员函数可进行字符串处理:

    str.substr(pos,length1); //返回对象的一个子串,从pos位置起,长length1个字符
    str.empty(); //查是否空串
    str.insert(pos,str2); //将str2插入str的pos位置处
    str.remove(pos,length1); //在str位置pos处起,删除长度为length1的字串
    str.find(str1); //返回str1首次在str中出现时的索引
    str.find(str1,pos); //返回从pos处起str1首次在str中出现时的索引
    str.length(str); //返回串长度

(6) C字符串与string类转换

C字符串到string类对象是由构造函数隐式自动进行,而string类对象到C字符串的转换必须执行显示的类型转换,应调用成员函数

str.c_str(); //将string类转换为C风格字符串,返回char*

◆ 3、【例5.12】判断字符串是否为回文。(查看源码

回文是指顺读和反读都一样的串,这里不分大小写,并滤去所有非字母字符,如:
    Madam,I’m Adam.
    Golf,No Sir,prefer prison flog
都是回文。

◆ 4、string类的优点

string类有自己的构造函数和析构函数,如果它作为类或结构的成员,要记住它是成员对象,当整个类对象建立和撤销时,会自动调用作为成员对象的string字符串的构造和析构函数。 

字符串数组

不仅可以用string定义字符串变量,也可以用string定义字符串数组。如:
    string name[5]; //定义一个字符串数组,它包含5个字符串元素
    string name[5]={″Zhang″, ″Li″, ″Fun″, ″Wang″, ″Tan″};  //定义一个字符串数组并初始化

此时name数组的状况如图5.11所示。

图5.11

关于字符串数组的几点说明:
  • 在一个字符串数组中包含若干个(现为5个)元素,每个元素相当于一个字符串变量。
  • 并不要求每个字符串元素具有相同的长度,即使对同一个元素而言,它的长度也是可以变化的,当向某一个元素重新赋值,其长度就可能发生变化。
  • 在字符串数组的每一个元素中存放一个字符串,而不是一个字符,这是字符串数组与字符数组的区别。如果用字符数组存放字符串,一个元素只能存放一个字符,用一个一维字符数组存放一个字符串。
  • 每一个字符串元素中只包含字符串本身的字符而不包括′′。

可见用字符串数组存放字符串以及对字符串进行处理是很方便的。

在定义字符串数组时怎样给数组分配存储空间呢?实际上,编译系统为每一个字符串变量分配4个字节,在这个存储单元中,并不是直接存放字符串本身,而是存放字符串的地址。在本例中,就是把字符串″Zhang″的地址存放在name[0],把字符串″Li″ 的地址存放在name[1],把字符串″Fun″的地址存放在name[2]……图5.11只是一个示意图。在字符串变量中存放的是字符串的指针(字符串的地址)。

最后

以上就是兴奋金针菇为你收集整理的C风格字符串和C++string类对比 使用实例 一.C风格字符串 二.标准的C++string类的全部内容,希望文章能够帮你解决C风格字符串和C++string类对比 使用实例 一.C风格字符串 二.标准的C++string类所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(69)

评论列表共有 0 条评论

立即
投稿
返回
顶部