代码改变世界

字符数组中的cin与cout

2013-09-11 21:02  Keiven_LY  阅读(2187)  评论(0编辑  收藏  举报
 1 #include<iostream>
 2 #include<stdlib.h>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     char str[]="Welcome to C++ world !";  //创建一个字符数组,并初始化
 9     cout<<str<<endl; //输出字符串
10     cout<<"请输入新的字符串:"<<endl;
11     cin>>str;
12     cout<<str<<endl;
13 
14     system("pause");
15 }

 

注:代码第3行   using namespace std;为名称空间编译指令

1、所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。
2、C++标准程序库中的所有标识符都被定义于一个名为std的namespace中
3、在标准C++以前,都是用#include<iostream.h>这样的写法的,因为要包含进来的头文件名就是iostream.h。标准C++引入了名字空间的概念,并把iostream等标准库中的东东封装到了std名字空间中,同时为了不与原来的头文件混淆,规定标准C++使用一套新的头文件,这套头文件的文件名后不加.h扩展名,如iostream、string等等,并且把原来C标准库的头文件也重新命名,如原来的string.h就改成cstring(就是把.h去掉,前面加上字母c),所以头文件包含的写法也就变成了#include <iostream>。
4、因此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用< iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。

#include <iostream.h>
         using namespace std; 则出错
所以 要么写成
#include <iostream >
using namespace std;
要么写成
#include <iostream.h>

 

 

疑问:代码第11行,输入的Hello everyone并没有超出为字符串数组str初始化的空间,为什么输出结果只是Hello

原因是:用cin>>进行输入操作时,跳过前导空白,从第一个有效字符起,向对应的字符数组依次存入字符,直到遇到一个空白字符才结识,这便完成了一个字符串的输入

 

那么,如何将含空格的字符串读到C风格字符串呢????——————使用get()与getline()函数

这两个函数都用于读入一行输入,直到遇到换行符,不同之处在于:getline()丢弃换行符,而get()会同时将换行符读入C风格的字符串中。

如:

#include<iostream>
#include<stdlib.h>

using namespace std;

int main()
{
    char name[16];
    char school[50];
    cout<<"请输入您的姓名:"<<endl;
    cin.get(name,16);

    cin.get();  //从输入流中读出换行符

    cout<<"请输入您的学校:"<<endl;
    cin.getline(school,50);
    cout<<"您的姓名是:"<<name<<endl;
    cout<<"您的学校是:"<<school<<endl;

    system("pause");
}

注:语句"cin.get()"的作用是从输入队列中提取一个字符,即将语句"cin.get(name,16)"遗留在输入队列中的换行符提取出来,否则,若没有语句"cin.get()",在执行语句

"cin.getline(school,50)"时,输入队列中的第一个字符就是一个换行符,,从而,getline()函数会认为已经到达末尾,没有任何可以读取的内容,因此,school将会是只有一个'\0'的空字符串。

从上面的理解,可以看出:

语句:

        cin.get(数组名,大小);

        cin.get();

与语句:

        cin.getline(数组名,大小);

两者是等价的。