C++字符数组的输入输出和字符串结束标志使用讲解

所属分类: 软件编程 / C 语言 阅读数: 86
收藏 0 赞 0 分享

C++字符数组的输入输出
字符数组的输入输出可以有两种方法:
1) 逐个字符输入输出。

2) 将整个字符串一次输入或输出。例如有以下程序段:

  char str[20];
  cin>>str; //用字符数组名输入字符串
  cout<<str; //用字符数组名输出字符串


在运行时输入一个字符串,如:

  China↙


在内存中,数组str的状态如图5.9所示,在5个字符的后面自动加了一个结束符′\0′。


输出时,逐个输出字符直到遇结束符′\0′,就停止输出。输出结果为:

  China


如前所述,字符数组名str代表字符数组第一个元素的地址,执行“cout<<str;”的过程是从str所指向的数组第一个元素开始逐个输出字符,直到遇到′\0′为止。

关于字符数组的输入输出请注意以下几点:
输出的字符不包括结束符′\0′。
输出字符串时,cout流中用字符数组名,而不是数组元素名。
如果数组长度大于字符串实际长度,也只输出到遇′\0′结束。
如果一个字符数组中包含一个以上′\0′,则遇第一个′\0′时输出就结束。
用cin从键盘向计算机输入一个字符串时,从键盘输入的字符串应短于已定义的字符数组的长度,否则会出现问题。

C++提供了cin流中的getline函数,用于读入一行字符(或一行字符中前若干个字符),使用安全又方便。


C++字符串和字符串结束标志

用一个字符数组可以存放一个字符串中的字符。如:

  char str[12]={'I',' ','a','m',' ','h','a','p','p','y'};


用一维字符数组str来存放一个字符串″I am happy″中的字符。字符串的实际长度(10)与数组长度(12)不相等,在存放上面10个字符之外,系统对字符数组最后两元素自动填补空字符′\0′。

为了测定字符串的实际长度,C++规定了一个“字符串结束标志”,以字符′\0′代表。在上面的数组中,第11个字符为′\0′,就表明字符串的有效字符为其前面的10个字符。也就是说,遇到字符′\0′就表示字符串到此结束,由它前面的字符组成字符串。

对一个字符串常量,系统会自动在所有字符的后面加一个′\0′作为结束符。例如字符串″I am happy″共有10个字符,但在内存中它共占11个字节,最后一个字节′\0′是由系统自动加上的。

在程序中往往依靠检测′\0′的位置来判定字符串是否结束,而不是根据数组的长度来决定字符串长度。当然,在定义字符数组时应估计实际字符串长度,保证数组长度始终大于字符串实际长度。如果在一个字符数组中先后存放多个不同长度的字符串,则应使数组长度大于最长的字符串的长度。

说明:′\0′只是一个供辨别的标志。

如果用以下语句输出一个字符串:

  cout<<″
  How do you do?″;


系统在执行此语句时逐个地输出字符,那么它怎么判断应该输出到哪个字符就停止了呢?

下面再对字符数组初始化补充一种方法:用字符串常量来初始化字符数组。例如:

  char str[]={″I am happy″};


也可以省略花括号,直接写成

  char str[]=″I am happy″;


不是用单个字符作为初值,而是用一个字符串(注意字符串的两端是用双撇号而不是单撇号括起来的)作为初值。显然,这种方法直观,方便,符合人们的习惯。注意:数组str的长度不是10,而是11(因为字符串常量的最后由系统加上一个′\0′)。因此,上面的初始化与下面的初始化等价:
 

  char str[]={'I',' ','a','m',' ','h','a','p','p','y','\0'};


而不与下面的等价:

  char str[]={'I',' ','a','m',' ','h','a','p','p','y'};


前者的长度为11,后者的长度为10。如果有

  char str[10]=″China″;


数组str的前5个元素为′C′,′h′,′i′,′n′,′a′,第6个元素为′\0′,后4个元素为空字符。见图。

需要说明的是:字符数组并不要求它的最后一个字符为′\0′,甚至可以不包含′\0′。如以下这样写完全是合法的:

  char str[5]={'C','h','i','n','a'};


是否需要加′\0′,完全根据需要决定。但是由于C++编译系统对字符串常量自动加一个′\0′。因此,人们为了使处理方法一致,便于测定字符串的实际长度,以及在程序中作相应的处理,在字符数组中有效字符的后面也人为地加上一个′\0′。如:

  char str [6]={'C','h','i','n','a','\0'};

更多精彩内容其他人还在看

用标准c++实现string与各种类型之间的转换

这个类在头文件中定义, < sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本
收藏 0 赞 0 分享

C++如何通过ostringstream实现任意类型转string

再使用整型转string的时候感觉有点棘手,因为itoa不是标准C里面的,而且即便是有itoa,其他类型转string不是很方便。后来去网上找了一下,发现有一个好方法
收藏 0 赞 0 分享

C/C++指针小结

要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区
收藏 0 赞 0 分享

C++ 类的静态成员深入解析

在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和成员函数使用规则,再给出一个实例来加深印象
收藏 0 赞 0 分享

C++类的静态成员初始化详细讲解

通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化
收藏 0 赞 0 分享

C++类静态成员与类静态成员函数详解

静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的。你在一个对象里给它赋值,其他对象里的该成员也会发生变化。为了避免混乱,所以不可在类体内进行赋值
收藏 0 赞 0 分享

C++中的friend友元函数详细解析

友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样
收藏 0 赞 0 分享

static全局变量与普通的全局变量的区别详细解析

以下是对static全局变量与普通的全局变量的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
收藏 0 赞 0 分享

C++ explicit关键字的应用方法详细讲解

C++ explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?下面就让我们一起来看看这方面的知识吧
收藏 0 赞 0 分享

教你5分钟轻松搞定内存字节对齐

随便google一下,人家就可以跟你解释的,一大堆的道理,我们没怎么多时间,讨论为何要对齐.直入主题,怎么判断内存对齐规则,sizeof的结果怎么来的,请牢记以下3条原则
收藏 0 赞 0 分享
查看更多