3.3.2 字符数组的cin和cout

    仅仅由字符组成,但结尾不是'\0'的数组不是C风格字符串,如下所示。


    char str[]={'H','e','l','l','o'};

    如此声明的str只能称为字符数组,空字符'\0'对C风格字符串十分重要,很多与之对应的处理函数和对象(包括cout和cin),都逐个处理C风格字符串的字符,直到遇到空字符为止,因此,对于“char str[]={'H','e','l','l','o'};”,cout在输出5个字符后,还会继续输出内存中后面字节的内容,直到遇到空字符为止,这时输出结果是不确定的,但由于内存中存在大量的空字节,所以这个过程应该可以很快停止。

    注意

    在使用中,应特别留意这种非C风格字符串的普通字符数组的用法。

    可以将C风格字符串(甚至是普通的字符数组)当成一个整体来进行输入输出操作,见代码3.4。

    代码3.4 C风格字符串的输入输出InputAndOutputAC-String


    <———————————文件名:example304.cpp————————————————> 01 #include<iostream> 02 int main() 03 { 04 using namespace std; 05 char str[]="Welcome to the C++world!";//创建字符数组,用C风格字符串为其初始化 06 cout<<str<<endl;//输出C风格字符串 07 cout<<"请重新输入一个字符串:"<<endl; 08 cin>>str;//字符数组整体输入 09 cout<<str<<endl; 10 return 0; 11 }

    输出结果如下所示。


    Welcome to the C++world! 请重新输入一个字符串: Hello everyone(注:键盘输入) Hello

    【代码解析】代码第5行声明了一个C风格字符串,大小为26个字节(25个字符加1个空字符),并进行了初始化。第6行“cout<<str<<endl;”将str作为标识,对C风格字符串进行了整体输出,第8行“cin>>str;”可以向C风格字符串中存入一个新的字符串,该字符串的长度不能超出初始化时所开辟的内存空间字节数减1,因为还要留出一个字节存放空字符'\0'。

    在上例中输入了“Hello everyone”,并没有超过25字节(26个字节-1),但为什么输出结果只有“Hello”呢,这是因为用cin>>进行输入操作时,跳过前导空白,从第一个有效字符起,向对应的字符数组中依次存入字符,直到遇到一个空白字符才结束,这便完成了一个字符串的输入,由于“Hello everyone”中“Hello”后面是空格,所以,只存储了“Hello”到C风格字符串str中,“everyone”则被忽略掉了。

    注意

    代码3.4 中,如果输入的连续字符串超过了26个字节,会引发内存错误。