[cpp] view plaincopy print?
  1. #include<iostream>
  2. #include<string>
  3. using namespace std;

#include<iostream>
#include<string>
using namespace std; 
[cpp] view plaincopy print?
  1. int main()
  2. {
  3. string str;
  4. cout<<"please input the str"<<endl;
  5. cin>>str;
  6. int n=str.length();     //  输出字符串长度
  7. cout<<"str length:"<<n<<endl;

int main()
{string str;cout<<"please input the str"<<endl;cin>>str;int n=str.length();     //  输出字符串长度cout<<"str length:"<<n<<endl;

用字符数组来存放字符串并不是最理想和最安全的方法。

C++提供了一种新的数据类型——字符串类型(string类型),在使用方法上,它和char、int类型一样,可以用来定义变量,这就是字符串变量——用一个名字代表一个字符序列。

实际上,string并不是C++语言本身具有的基本类型,它是在C++标准库中声明的一个字符串类,用这种类可以定义对象。每一个字符串变量都是string类的一个对象。

一、字符串变量的定义和引用

1. 定义字符串变量
和其他类型变量一样,字符串变量必须先定义后使用,定义字符串变量要用类名string。如
string string1; //定义string1为字符串变量
string string2=″China″; //定义string2同时对其初始化
应当注意: 要使用string类的功能时,必须在本文件的开头将C++标准库中的string头文件包含进来,即应加上
#include <string> //注意头文件名不是string.h

2. 对字符串变量的赋值
在定义了字符串变量后,可以用赋值语句对它赋予一个字符串常量,如
string1=″Canada″;
既可以用字符串常量给字符串变量赋值,也可以用一个字符串变量给另一个字符串变量赋值。如
string2=string1; //假设string2和string1均已定义为字符串变量
不要求string2和string1长度相同,假如string2原来是″China″,string1原来是″Canada″,赋值后string2也变成″Canada″。在定义字符串变量时不需指定长度,长度随其中的字符串长度而改变。

可以对字符串变量中某一字符进行操作,如
string word=″Then″; //定义并初始化字符串变量word
word[2]=′a′; //修改序号为2的字符,修改后word的值为″Than″

3. 字符串变量的输入输出
可以在输入输出语句中用字符串变量名,输入输出字符串,如
cin>> string1; //从键盘输入一个字符串给字符串变量string1
cout<< string2; //将字符串string2输出

二、字符串变量的运算

在上一节中可以看到: 在以字符数组存放字符串时,字符串的运算要用字符串函数,如strcat(连接)、strcmp(比较)、strcpy(复制),而对string类对象,可以不用这些函数,而直接用简单的运算符。

  1. 字符串复制用赋值号
    string1=string2;
    其作用与“strcpy(string1,string2);”相同。
  2. 字符串连接用加号
    string string1=″C++″; //定义string1并赋初值
    string string2=″Language″;//定义string2并赋初值
    string1=string1 + string2;//连接string1和string2
    连接后string1为″C++ Language″。
  3. 字符串比较直接用关系运算符
    可以直接用 ==(等于)、>(大于)、<(小于)、!=(不等于)、>=(大于或等于)、<=(小于或等于)等关系运算符来进行字符串的比较。
    使用这些运算符比使用5.5.5节中介绍的字符串函数直观而方便。

三、字符串数组

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


图5.11

关于字符串数组的几点说明:

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

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

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

一、字符串连接函数 strcat

其函数原型为
strcat(char[],const char[]);
strcat是string catenate(字符串连接)的缩写。该函数有两个字符数组的参数,函数的作用是:将第二个字符数组中的字符串连接到前面字符数组的字符串的后面。第二个字符数组被指定为const,以保证该数组中的内容不会在函数调用期间修改。连接后的字符串放在第一个字符数组中,函数调用后得到的函数值,就是第一个字符数组的地址。例如
char str1[30]=″People′s Republic of ″;
char str2[]=″China″;
cout<<strcat(str1,str2));//调用strcat函数
输出:
People′s Republic of China
连接前后的状况如图5.10所示。


图5.10

二、字符串复制函数strcpy

其函数原型为
strcpy(char[],const char[]);
strcpy是string copy(字符串复制)的缩写。它的作用是将第二个字符数组中的字符串复制到第一个字符数组中去,将第一个字符数组中的相应字符覆盖。例如
char str1[10],str2[]=″China″;
strcpy(str1,str2);
执行后,str2中的5个字符″China″和′\0′(共6个字符)复制到数组str1中。

关于字符串复制函数strcpy的几点说明:

  1. 在调用strcpy函数时,第一个参数必须是数组名(如str1),第二个参数可以是字符数组名,也可以是一个字符串常量。
  2. 可以用strcpy函数将一个字符串中前若干个字符复制到字符数组中去。
  3. 只能通过调用strcpy函数来实现将一个字符串赋给一个字符数组,而不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。

三、字符串比较函数strcmp

其函数原型为
strcmp(const char[],const char[]);
strcmp是string compare(字符串比较)的缩写。作用是比较两个字符串。由于这两个字符数组只参加比较而不应改变其内容,因此两个参数都加上const声明。以下写法是合法的:
strcmp(str1,str2);
strcmp(″China″,″Korea″);
strcmp(str1,″Beijing″);

比较的结果由函数值带回:

  1. 如果字符串1=字符串2,函数值为0。
  2. 如果字符串1>字符串2,函数值为一正整数。
  3. 如果字符串1<字符串2,函数值为一负整数。

字符串比较的规则与其他语言中的规则相同,即对两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到′\0′为止。如全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。

注意:对两个字符串比较,不能用以下形式:
if(str1>str2) cout<<″yes″;
字符数组名str1和str2代表数组地址,上面写法表示将两个数组地址进行比较,而不是对数组中的字符串进行比较。对两个字符串比较应该用
if(strcmp(str1,str2)>0) cout<<″yes″;

四、字符串长度函数strlen

函数原型为
strlen(const char[]);
strlen是string length(字符串长度)的缩写。它是测试字符串长度的函数。其函数的值为字符串中的实际长度,不包括′\0′在内。如
char str[10]=″China″;
cout<<strlen(str);
输出结果不是10,也不是6,而是5。

以上是几种常用的字符串处理函数,除此之外还有其他一些函数。

C++用string 定义字符串数组相关推荐

  1. Java 定义字符串数组

    String[] qyidArr = null;   //定义数组 String psid2 = "";       //定义字符串 psid2 +=","+i ...

  2. python定义字符串数组_python数组声明

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 如何在python? 我无法在文档中找到对数组的任何引用... 我正在制作一个小 ...

  3. 刚入门者必看(如何在c++里定义字符串数组)

    像python写多了再回头看c++可能会觉得为什么c++不能像python那样灵活.毕竟python一个列表list直接把数字,字符,字符串拖家带口的写在列表里面,而c++貌似是不可以的. 废话不多说 ...

  4. java定义字符串数组_java字符数组用法总结,java字符串数组的定义与使用

    java字符数组,java数组的定义与使用 二维数组 String[] str = new String[5]; //创建一个长度为5的String(字符串)型的一维数组 String[] str = ...

  5. C++定义字符串数组的方法

    总结:将数组元素类型最好定义为string类型,而不是char*类型(VS2017无法通过) #include <iostream> using namespace std;int mai ...

  6. c语言结构体定义字符串数组,C语言,结构体中字符串的声明(采用字符指针还是字符数组)...

    结构体中,字符串选项是用字符数组表示好,还是用字符指针表示好? typedef struct person{ char *name; int age; char sex[6]; }: 该结构体中nam ...

  7. python定义字符串数组初始化_字符数组及其定义和初始化,C语言字符数组详解...

    字符数组及其定义和初始化,C语言字符数组详解 字符串的存储方式有字符数组和字符指针,我们先来看看字符数组. 因为字符串是由多个字符组成的序列,所以要想存储一个字符串,可以先把它拆成一个个字符,然后分别 ...

  8. python定义字符串数组_从字符串数组(或元组)在Python中创建动态sql“ in list”子句的“最佳”方法是什么?...

    我正在从Python(使用MySQLDb)运行一个动态MySQL查询,该查询包括一个包含字符串值的" in list"子句.执行此功能的函数将获取一个值数组.如果有帮助,我可以将该 ...

  9. python定义字符串数组_Python数组定义方法

    本文实例讲述了Python数组定义方法.分享给大家供大家参考,具体如下: Python中没有数组的数据结构,但列表很像数组,如: a=[0,1,2] 这时:a[0]=0, a[1]=1, a[[2]= ...

最新文章

  1. 【译】特征工程最佳实践
  2. 计算机vb实验报告,VB综合实验报告格式
  3. 开发日记-20190617 关键词 bash命令尝试模拟点击事件
  4. android不同机型上界面适配问题
  5. java thread_Java(多线程Thread)
  6. 【安卓开发 】Android初级开发(一)控件通用属性
  7. 王道考研 计算机网络11 数据链路层 封装成帧 透明传输 流量控制 停止-等待协议 后退N帧协议GBN 选择重传协议SR
  8. 分布式锁的几种实现方式(转)
  9. 冬季海报素材温暖上线,PSD分层设计师最爱
  10. TypeError: 'str' object is not callable
  11. 教你用手机制作二寸证件照,操作简单,一学就会!
  12. 《客户端性能测试基本流程》
  13. Activiti实现流程定义的控制与修改
  14. android system image,android systemimage默認大小以及如何修改
  15. 使用COLMAP进行三维重构
  16. 50个安卓开发者应该熟悉的Android Studio技巧和资源
  17. 操作系统——如何求磁盘的物理地址
  18. 【论文】多核实时操作系统的确定性调度设计
  19. 微软 Azure人工智能认知服务打造语音提醒喝水助手(带源码和演示地址)
  20. Green Plum 非并行备份恢复方案

热门文章

  1. android 代码混淆示例
  2. 我的KT库之-----扩展方法
  3. 【算法】快速排序算法的编码和优化
  4. 音频监控叫好又叫座,核心部件拾音器怎么装?
  5. UVa 1025 A Spy in the Metro
  6. mysqlimport
  7. asp.net的一个不错日期控件
  8. Citus中的分片策略:Append Distribution追加分配
  9. 视频监控/存储系统设计要点
  10. Kuebernetes之DaemonSet