复合数据类型介绍-C语言字符串

一、字符串

字符串是存储在内存连续字节中的一系列字符,包括了C-风格字符串和String类库两种使用方法。

二、C-风格字符串

1.1、空字符结尾

存储在连续字节中的一系列字符意味着可以将字符串存储在char数组中,其中每个字符都位于自己的数组元素中。但是C-风格字符串具有一种特殊的性质:以空字符结尾,空字符被写作\0,其ASCLL码为0,用来标记字符串的结尾。空字符结尾对于字符串的定义十分重要,系统函数逐个处理字符串中字符时,需要空字符确定何时停止处理。在下示例中,只有第二个数组cat是字符串。

char dog[8] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};  // not a string
char cat[8] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', '\0'}; // a string

1.2、字符串初始化

在上示例中,将数组初始化为字符串,使用了大量单引号,且需要在结尾加上空字符。
还有另一种简便的将数组初始化为字符串的方法:只需要使用一个引号括起的字符串即可,这样被称为字符串常量

char bird[11] = "Mr. Cheeps";
char fish[] = "Bubbles";

这里双引号括起的字符串已经隐式的包括了结尾的空字符,因此不用显式的写入。C++会自动加上结尾的空字符。
开发人员自己定义数组的长度时,需要确保数组是足够大的,能够存储字符串常量中的所有字符,包括空字符。
也可以如上例中的第二个,使用字符串常量初始化数组,可以让编译器自己计算数组元素的个数,这样更加安全。
在这里插入图片描述

1.3、字符串常量和字符常量

字符串常量(双引号括起)不等于字符常量(单引号括起)。
字符常量(如‘S’)是字符串编码的简写表示,在ASCLL系统上,‘S’是83的另一种写法。

char size = ‘S’;// this is fine

但是“S”不是字符常量,它表示的两个字符(字符S和‘\0’)组成的字符串,更为重要的是,“S”实际上表示的是字符串所在的内存地址,因此下示例中的语句是试图将一个内存地址赋给size变量。由于地址在C++中是一种独立的数据类型,因此编译器不会允许这种不合理的赋值。

char size = "S"//Illegal type mismatch

1.4、在数组中使用字符串

要将字符串存储到数组中,有两种常用的方法。

1.4.1、将数组初始化为字符串常量

将一个数组初始化为用引号括起的字符串

const int size = 15;
char name1[size] = "oop";

1.4.2、将输入读入到数组中

使用cin函数讲一个输入字符串存储到数组中

const int size = 15;
char name1[size];
cin>>name1;

1.4.3、cstring.h

标准头文件cstring.h(string.h)提供了strlen()标准C语言库函数等声明

#include <cstring>
#include <iostream>
int main()
{
	const int size = 15;
	char name1[size] = "oop";
	cout << strlen(name1);
	cout << sizeof(name1);
	return 0
}

strlen()将会统计存储在数组中字符串的长度,为有效可见字符个数(不包括空字符),也不是数组本身长度,在上例中结果为3;
sizeof()将会统计整个数组的长度,在上例中为15字节

1.4.4、字符串的cin输入

cin函数读取来自键盘的输入信息,并且使用**空白(空格,制表符,换行符)**来确定字符串输入的结束位置。
这就意味着cin函数无法一次获取一个包含多个单词的英文句子字符串,只能是一个单词,读取到该单词后,cin将字符串放到数组中,并自动在结尾添加空字符。
另外这种使用cin获取键盘输入字符串的形式存在一个潜在的问题:即输入字符串可能比目标数组长,无法防止将包含10个字符的字符串放到5个字符的数组中的情况。

1.4.5、字符串的按行输入

通常情况下,键盘一次输入的信息包括了多个单词(存在空格),那么需要程序使用面向行而不是面向单词的方法读取字符串,比如istream类的其他成员函数get()或getline()。
getline()通过换行符来确定行尾,但不保存换行符,而是用空字符来替换换行符。
get不会丢弃换行符,而是将它留在输入队列中。
需要注意的是,getline()使用更加简单,但是get()使得错误检查更仔细些,因为get()函数可以看到一行读取结束后的下一个字符是否为换行符,这样就知道是一行输入被全部读取存储了,还是指定数组长度被填满了而结束读取。

1.4.5.1、getline()

getline()函数读取整行输入,并且通过回车键输入的换行符来确定输入信息的结尾位置。
调用方法为cin,getline(),并且给定两个参数,分别是存储字符串的数组变量名arrayName,和读取的字符长度size。
程序执行时函数最多可以读取size-1个字符,余下的空间用于存储自动在结尾处添加的空字符,getline()函数将会在读取指定数目的字符或遇到换行符时停止读取。

cin.getline(name, 20);

在这里插入图片描述

1.4.5.1、get()

常见的get()函数也使用与getline相同的两个参数,参数解释的方式也相同,区别是get()不再读取,不会丢弃输入队列中的换行符,而是将其保留在输入队列中。

cin.get(name1,size);
cin.get(name2,size);

如上例所示,连续调用get函数,会导致第一次调用get后拿走需要的一行字符串,但是换行符被留在了输入队列里面,因此第二次调用的第一个字符便是换行符,此时get认为已到达行尾,而无法发现可读取的内容,这种情况下get将不能跨过该换行符。
此时可以用到另一种get()函数,即不带任何参数的函数,可以调用读取下一个字符(即便是换行符),因此可以用于处理换行符,为读取下一行做准备。

cin.get(name1,size);
cin.get();
cin.get(name2,size);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值