字符串

  • 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风格字符串变量或常量;该函数返回值为一个无符号整数;

二、复制

strcpy(strDest,strSour);

其中,参数StrDest是C风格字符串变量;参数StrSour是C风格字符串常量或变量;

将strSour(包括'\0')复制到strDest所占内存块中,并返回strDest基址;

strDest必须有足够空间容纳strSour,否则程序会出错;

strncpy(strDest,strSour,n);

将strSour的前n个字符复制到strDest相应位置上,并返回strDest的初始地址;

注意:若被幅值的字符中含有'\0',则会影响目标字符串的使用;

三、比较

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;

strncmp(str1,str2,n)

指定比较范围,即只比较str1和str2的前n个字符;

四、连接

strcat(strDest,strSour);

将strSour(包括空字符'\0')链接到strDest结尾处(strDest结尾原有的'\0'去掉),并返回strDest的基址;

连接函数调用作为独立语句出现时,函数返回值被忽略;

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*








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值