- C风格字符串
一、字符串常量
C风格字符串常量是一堆双引号""括起来的字符序列;
存储时,结尾自动加上'\0',即ASCII码为0的字符,称为字符串结束符;输出时根据该空字符确定字符串的终止;
二、字符数组
C风格字符串变量是用来存放字符串数据并以'\0'结尾的字符数组;
在设定数组大小要为空字符预留一个位置,该空字符是区分字符串和一般数组的标志;
1 字符串声明及赋值
1.1 先声明字符串数组,再对数组元素逐个赋值;
注意:必须在字符串内容后一个数组元素赋值为'\0',否则无法做为字符串进行处理;
1.2 声明的同时初始化
char cstr[7];
cstr[0]='H';cstr[1]='e';cstr[2]='l';cstr[3]='l';cstr[4]='o';cstr[5]='.';cstr[6]='\0';
char cstr[6]="Hello.";
char cstr[]="Hello.";
char cstr[]={'H','e','l','l','l','o','.','\0'};
char* cstr="Hello.";
注意:若用字符指针访问C风格字符串,该内存块只能读,不能写;
2 字符串的输入输出
2.1 插入提取操作符
char cstr[20];
cin>>cstr;
cout<<cstr<<endl;
注意:>>以空白符(空格、Tab、回车等)作为读入数据项的分隔符;
2.2 istream类的get
cin.get(cstr,len);
至多把len-1个字符读入到字符串变量cstr中,并自动附加一个空白符'\0'作为字符串结束符;
char ch=cin.get();
get一般用于读入单个字符,且在读入时不忽略空白字符;
2.3 istream类的getline
cin.egtline(cstr,len);
至多把len-1个字符读入到字符串变量cstr中,并自动附加一个空白符'\0'作为字符串结束符;
注意:使用get和getline操作读入字符串时,结束条件有二:换行符或读入的字符数达到len-1;
- C字符串操作
一、字符串长度
int len=strlen(cstr);
其中,cstr是C风格字符串变量或常量;该函数返回值为一个无符号整数;
二、复制
1 strcpy(strDest,strSour);
其中,参数StrDest是C风格字符串变量;参数StrSour是C风格字符串常量或变量;
将strSour(包括'\0')复制到strDest所占内存块中,并返回strDest基址;
strDest必须有足够空间容纳strSour,否则程序会出错;
2 strncpy(strDest,strSour,n);
将strSour的前n个字符复制到strDest相应位置上,并返回strDest的初始地址;
注意:若被幅值的字符中含有'\0',则会影响目标字符串的使用;
三、比较
1 strcmp(str1,str2)
其中,str1和str2可以是C风格字符串变量或常量;
比较结果有三中:
1.1 str1大于str2,返回一个大于0的整数值:第一对不同字符的ASCII码值得差(某些编译器返回固定值1);
1.2 str1小于str2,返回一个小于0的整数值:第一对不同字符的ASCII码值得差(某些编译器返回固定值-1);
1.3 str1等于str2,返回整数值0;
2 strncmp(str1,str2,n)
指定比较范围,即只比较str1和str2的前n个字符;
四、连接
1 strcat(strDest,strSour);
将strSour(包括空字符'\0')链接到strDest结尾处(strDest结尾原有的'\0'去掉),并返回strDest的基址;
连接函数调用作为独立语句出现时,函数返回值被忽略;
2 strncat(strDest,strSour,n);
注意:若strDest可连接的字符刚好等于n,而strSour的n个字符都不是非空字符,则strDest的末尾将没有'\0';
因此,调用函数strncat()时,最好连接至多n-1个字符;
五、字符串的类型转换
1 atoi(cstr):返回类型int,将C风格字符串转换成int型数据;
2 atol(cstr),返回类型long;
3 atod(cstr),返回类型double;
上述函数忽略起首的空白字符,只对其后的非空白字符进行处理;
当字符串以数字起首时,该函数会忽略位于数字后面的非数字符号,只对数字进行处理;
当字符串以非数字起首,该字符串不能代表一个数值;
若字符串不能转换为数值,函数返回0;
若字符串能转换的数值超过返回值类型的表示范围,则函数返回一个极小值或极大值;
六、处理单个字符
C++提供处理单个字符的函数:
1 bool isalpha(ch):字符是否为英文字母
2 bool isupper(ch):字符是否为大写英文字母
3 bool islower(ch):字符是否为小写英文字母
4 bool isdigit(ch):字符是否为数字
5 bool isxdigit(ch):字符是否为十六进制字符
6 bool isspace(ch):字符是否为空白符
7 bool iscntrl(ch):字符是否为控制字符
8 bool ispunct(ch):字符是否为标点字符
9 bool isalnum(ch):字符是否为英文字母或数字
10 bool isprchar(ch):字符是否为可打印字符
11 bool isgraph(ch):字符是否为可显示字符
12 char toupper(ch):字母转换成大些字母
13 char yolower(ch):字母转换成小写字母
- string对象字符串
C风格字符串变量的长度受数组大小限制;C++标准库提供类string支持长度可变的字符串;
使用string类对象,必须包含头文件string:
#include <string>
一、string对象的声明、初始化、赋值
<pre name="code" class="cpp">string str; // 使用默认构造函数,str为空串
string str1("Hello."); // 将str1初始化为字符串字面值得副本
string str2(str1); // 将str2初始化为str1的副本
string str3(n,'a'); // 将str3初始化为由n个字符'a'构成的字符串
string str4="Hello."; // 将字符串常量赋值给str4
string str5=str4;
二、string字符串的输入输出
1 提取插入操作符
使用提取操作符>>输入string对象时,只能输入连续的字符,不能包含中间的空白字符;
2 标准库函数getline(instream,str)
给string对象str输入整行字符,包括起始和中间的空白符;
其中,instream是输入流对象,可以是istream或ifstream对象;换行符不存入str中;
getline(cin,str);
三、string字符串长度
使用类成员函数length()或size()获取字符串长度;
int len=str.size();
四、string字符串比较
直接使用关系操作符<、>、<=、>=、==、!=进行字符串比较;
string对象比较结果只有两个:true和false;
五、string字符串子串
1 获取子串
string sub_str=str.substr(pos,len);
其中,pos是获取子串的开始位置;len是获取子串的长度;substr()函数返回一个临时的string对象;
若len超过string对象的长度,则substr所提取的子串将包含从pos位置到字符串结尾的所有字符;
2 查询指定字符或字符串
int pos=str.fine(arg);
查询某个字符或子串在string对象中的起始位置;
其中,arg是string或char类型的表达式,或C风格字符串常量;
3 获取单个字符
3.1 str[i]
3.2 str.at[i]
[]和at返回值类型是char;子串操作substr返回类型是string,即使提取的子串只有一个字符;
使用at方法比使用[]安全,因为at会检查i的值。当i不在正常范围,系统会产生一个异常,并终止程序;
六、string字符串连接
使用重载+操作符进行连接;
连接操作符的两个操作数必须至少有一个是string对象,即string变量,不能两个都是字符串常量;
七、string对象转换成C风格字符串
使用c_str()函数将string对象转换成C风格字符串;
c_str()函数没有参数,返回C风格字符串的初始地址,即返回类型为const char*;
因此,如果将一个string字符串转换成C风格字符串,需要用到赋值函数strcpy:
string str="Hello.";
char p[20]; // 不能定义为char* p;,因为这样p还没指向确定的内存空间就在下一步使用p了
strcpy(p,str.c_str()); // 不能使用char* p=str.c_str();,因为c_str()返回类型是const char*