字符串是存储在内存的连续字节中的一系列字符。
并且,因为是内存中的连续字节中的一系列字符。意味着可以将字符串存储在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()读取到换行符为止,并储存换行符。
具体在(四十七)中说明