(四十六)字符串

简介:

字符串是存储在内存的连续字节中的一系列字符。

并且,因为是内存中的连续字节中的一系列字符。意味着可以将字符串存储在char数组中(因为字符是被存储为char类型的,又因为是连续的,可以认为是若干char类型 所组成的数组)。

每个字符都位于自己的数组的元素中——即每一个字符对应char数组中的一个值。

字符串提供了一种存储文本信息的便捷方式,如提供给用户的消息(“比如说你看到的这一句话”)或者用户的响应(“我打了一些字给电脑”)——用户打的字,输入到字符串char 字符串名[长度+1],或者string类型的变量之中,或者类似的,并非能储存到每个类型之中(比如int类型就不行,因为输出的时候cout要根据类型来决定如何输出储存在内存中的值)

字符串需要以空字符结尾,写作\0,其ASCII码为0,用于标记字符串的结尾。如果没有以空字符结尾的话,是不行的。——因为可能会显示更多的(不在字符串内容中)的字符。

而且,字符串需要用char的数组。

上代码:


#include<iostream>
int main()
{
	using namespace std;
	char a[5] = { 'a','b','c','d','\0' };	//C-风格的字符串的结尾需要为\0
	cout << a << endl;
	char b[5] = { "abcd" };	//另一种方式,直接用引号将字符串括在里面,并且注意,括在里面的字符应比字符串位数少一(因为要给最后的空字符留位)
	cout << b << endl;	//打印字符串b
	cout << b[0] << endl;	//打印字符串b中的第一个字符
	char c[] = { "I love you" };	//第三种方式,不需要注明字符串的长度,有编译器自动完成。注意,长度为字符串长度+1(最后一位要有空字符)
	cout << "打印字符串C: " << c << endl;
	cout << "字符串C的第一个字符是:" << c[0] << "字符串C的第三个字符是:" << c[2] << endl;
	system("pause");
	return 0;
}

输出结果为:


abcd
abcd
a
打印字符串C: I love you
字符串C的第一个字符是:I字符串C的第三个字符是:l

需要注意的是,让数组的长度不能小于字符串的长度(需要计算最少长度,记得加1因为空字符)。

数组的长度可以大于字符串的长度,数组的长度大于字符串的长度,实际上只是多占了内存空间。也可以让编译器自己计算字符串的长度,这样比自己计算更为安全。

注意:千万不要忘了结尾一定要有空字符,并且要算入数组的元素之一。

 

另外,需要区分字符常量(如'a')和字符串常量(如"a")之间的区别。前者实际上是'a'的数值编码,在ASCII中,编码为97。而"a"实际上是一个有两个元素的数组,第一个元素是字母a,第二个元素为空字符,数组为{'a','\0'}。

 

 

将字符串输入到数组中的方法:

①数组在声明的时候,进行初始化,初始化为字符串常量;

②通过例如cin语句,将用户输入的读入到数组中。

 

上代码:


#include <iostream>
#include <cstring>	//可以使用标准C语言库函数strlen()来确认字符串的长度(不包含空字符)

int main()
{
	using namespace std;
	const int a = 15;
	char aa[a];		//声明数组aa,数组元素为15个元素(因为常量a=15)
	char bb[a] = { "my name is: " };	//声明数组bb,数组元素为15个元素,其中前几个元素分别为m,y,空格,n,a,m,e,空格,i,s,空格。后面为空字符
	cout << "What is your name?" << endl;	
	cout << bb;	//打印数组bb,即my name is: (冒号后有个空格)
	cin >> aa;	//用户输入自己的名字,并将字符串输入到数组aa
	cout << "Now, I know your name is " << aa << " ." << endl;
	cout << "你名字的长度为:" << strlen(aa) << "个字。" << endl;	//strlen(数组名)可以显示数组的长度,不包括空字符。
	cout << "你名字所使用的字符串aa的占用" << sizeof(aa) << "个字节(bytes)\n";	//sizeof(数组名)可以显示数组占用的字节数,包括空字符。
	aa[1] = '\0';	//将字符串aa(存储用户输入名字)的第二个字符设置为空字符
	cout << "你名字首字母为:" << aa << endl;	//因为cout语句输出到空字符后停止
	system("pause");
	return 0;
}

输出结果1:


What is your name?
my name is: human
Now, I know your name is human .
你名字的长度为:5个字。
你名字所使用的字符串aa的占用15个字节(bytes)
你名字首字母为:h

输出结果2:(和上面输入的不同)

What is your name?
my name is: 王冬
Now, I know your name is 王冬 .
你名字的长度为:4个字。
你名字所使用的字符串aa的占用15个字节(bytes)
你名字首字母为:

可以发现,由于数组二输入的为汉字,一个汉字占用2个字节。所以显示的名字产长度为4个字(准确说应该是4个字节),又因为第一个字为王(占用两个字节),所以显示首字母(只显示一个字节)便无法显示了。

 

但是,由于cin的机理,在读取用户输入的时候,他不会对空格,tab,或者换行符进行响应(读取到以上三个情况后,自动停止读取),假如我输入的是“王 冬”,cin则只能读取“王”,而把冬丢弃掉。在遇见英文名的时候,这种情况将极为突出。(因为英文名中,姓和名中间有空格)

 

因此,我们需要采用getline()或者get()来读取一行。

其中,getline()将读取到换行符位置,通过确认回车输入的换行符来确定输入的结尾,并将换行符丢弃(即不会读取换行符),而get()读取到换行符为止,并储存换行符。

 

具体在(四十七)中说明


目录
相关文章
|
6月前
|
C++ 索引
C++系列十五:字符串
C++系列十五:字符串
|
6月前
|
Go Java C++
Java每日一练(20230411) 同构字符串、随机字符串、交错字符串
Java每日一练(20230411) 同构字符串、随机字符串、交错字符串
40 0
Java每日一练(20230411) 同构字符串、随机字符串、交错字符串
|
Java 程序员
【JavaSE】Java基础语法(四十六):枚举
1. 概述 枚举是一种特殊的数据类型,它列出了一组预定义的常量,并使用标识符来引用这些常量。枚举的用途很广泛,下面列举了几个常见的应用场景: 管理常量:如果您需要在程序中使用一组固定不变的常量,建议使用枚举来管理这些常量。这样可以使得代码更加可读和易于维护。例如,你可以使用一个代表颜色的枚举,来管理程序中可能需要使用到的所有颜色。
【JavaSE】Java基础语法(四十六):枚举
|
存储 C语言
内存系列函数+字符分类函数+字符转换函数(保姆级教程)
C语言学习第二十一弹——教你学会内存系列函数和字符分类转换函数简化部分例题
|
Java
java学习第十一天笔记-字符串207-统计空格后字符串个数
java学习第十一天笔记-字符串207-统计空格后字符串个数
54 0
java学习第十一天笔记-字符串207-统计空格后字符串个数
|
Java
java学习第三天笔记-运算符07-字符和字符串得操作49
java学习第三天笔记-运算符07-字符和字符串得操作49
53 0
java学习第三天笔记-运算符07-字符和字符串得操作49
|
Java
java学习第三天笔记-运算符06-字符和字符串得操作48
java学习第三天笔记-运算符06-字符和字符串得操作48
49 0
java学习第三天笔记-运算符06-字符和字符串得操作48
【编程】89%的人不知道的字符拼接成字符串的注意点
【编程】89%的人不知道的字符拼接成字符串的注意点
84 0
|
Java 索引 DataX
笑谈字符串与字符、字节数组的关系 | 带你学《Java面向对象编程》之三十一
本节主要为读者介绍了Java为开发者提供的一些用于进行字符串与字符、字节数组之间相互转换的基本方法。
|
Java 索引
迅速学会字符串查找与替换 | 带你学《Java面向对象编程》之三十三
在日常的文本操作中经常会碰到查找与替换的操作,作为和文本并无不同的字符串同样也有相应的、丰富的操作方法。