(四十六)字符串

来源:互联网 发布:js window.onload事件 编辑:程序博客网 时间:2024/05/21 07:49

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

并且,因为是内存中的连续字节中的一系列字符。意味着可以将字符串存储在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-风格的字符串的结尾需要为\0cout << a << endl;char b[5] = { "abcd" };//另一种方式,直接用引号将字符串括在里面,并且注意,括在里面的字符应比字符串位数少一(因为要给最后的空字符留位)cout << b << endl;//打印字符串bcout << 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;}

输出结果为:


abcdabcda打印字符串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;//用户输入自己的名字,并将字符串输入到数组aacout << "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: humanNow, 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()读取到换行符为止,并储存换行符。

 

具体在(四十七)中说明


0 0
原创粉丝点击