C++ 读取键盘输入(cin/cin.getline()/cin.get()/cin.clear())



目录(?)[+]


1.cin

C++ 使用cin可以方便的读取键盘输入的字符,例如:



[cpp]  view plain copy



1. //test input  
2. #include <iostream>                             
3. int main()                                
4. {                                         
5. using namespace std;  
6. const int size = 20;  
7. char name[size];  
8. char pl[size];//program language  
9.   
10. "Enter your name:";  
11.     cin>>name;  
12. "Enter your favorite program language:";  
13.     cin>>pl;  
14. "Hello "<<name<<", your favorite program language is "<<pl<<endl;  
15. return 0;  
16. }



首先,每个输入我们只输入一个单词,如下:

Android 获取输入法打开状态 读取输入法内容_Android 获取输入法打开状态

但如果我们在第一个输入时填写两个以上单词:

Android 获取输入法打开状态 读取输入法内容_ci_02

可以发现,第二个输入还没来得及响应,就已经都显示出来了。

原因是:cin通过使用空白(空格、制表符和换行符)来定字符串的界。这意味着cin在读取字符数组输入时只读取一个单词,读取该单词后,cin将该字符串放一数组中,并自动结尾添加空字符。另外,cin也没有很好的控件输入的字符数,即输入字符数大于数组大小的情况没有处理。

2.cin.getline()

基于上面的情况,使用cin.getline()读取一行数据。

cin.getline()函数读取整行,它使用通过回车键输入的换行符来确定输入结尾。该函数有两个参数。第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数(包括空字符),cin.getline()成员函数在读取指定数目的字符或遇到换行符时停止读取

如下:



[cpp]  view plain copy



    1. cout<<"Enter your name:";  
    2. cin.getline(name,size);  
    3. cout<<"Enter your favorite program language:";  
    4. cin.getline(pl,size);  
    5. cout<<"Hello "<<name<<", your favorite program language is "<<pl<<endl;



    现在再来获得多个单词的输入:

    Android 获取输入法打开状态 读取输入法内容_ci_03

    发现就正常了。需要注意的是,cin.getline()丢弃了换行符。

    3.cin.get()

    get()函数有好几种变体,其中有一种与getline()完全相同的参数,但该函数不再读取并丢弃换行符(不读取意味着换行符还在输入队列中):



    [cpp]  view plain copy



      1. cout<<"Enter your name:";  
      2. cin.get(name,size);  
      3. cout<<"Enter your favorite program language:";  
      4. cin.get(pl,size);  
      5. cout<<"Hello "<<name<<", your favorite program language is "<<pl<<endl;



      尝试输入:

      Android 获取输入法打开状态 读取输入法内容_ci_04

      发现并不好使,原因是由于第一次调用后,换行符将留存输入队列中,因此第二次调用时看到的第一个字符为换行符。因此get认为已经到达行尾,而没有发现任何可读取的内容。get()(不带任何参数的变体)可以读取下一个字符(包括换行符)。因此可以:



      [cpp]  view plain copy


      1. cin.get(name,size).get();  
      2. cin.get(pl,size).get();


      即可。

      注意:有些C++版本没有不带参数的get()变体。可能有只有char参数的变体。可用下面的代替:

      char ch;cin.get(name,size).get(ch);

      4.读取空行和其他问题

      当getline()或get()读取空行时将如何?一般是下一条输入语句将在前一条结束读取的位置开始读取;但当有空行时,当get()读取空行后将设置失效位(failbit),这意味接下来的输入将被阻断,但可以用下面的命令来恢复输入:cin.clear()    cout<<"Enter your name:";  



      [cpp]  view plain copy

      1. cout<<"Enter your name:";    
      2. cin.get(name,size).get();    
      3. if (!cin)  
      4. {  
      5.     cin.clear();  
      6. while (cin.get()!='\n')  
      7.     {  
      8. continue;  
      9.     }  
      10. }  
      11. cout<<"Enter your favorite program language:";    
      12. cin.get(pl,size).get();    
      13. cout<<"Hello "<<name<<", your favorite program language is "<<pl<<endl;

      另一个潜在的问题是,输入字符可能比分配的空间长。如果输入行包含的字符数比指定的多,则这get()和getline()将把余下的字符留在输入队列中,而getline()还会设置失效位,并关闭输入。




      [cpp]  view plain copy



        1. cout<<"Enter your name:";    
        2. cin.getline(name,size);    
        3. if (!cin)  
        4. {  
        5.     cin.clear();  
        6. while (cin.get()!='\n')  
        7.     {  
        8. continue;  
        9.     }  
        10. }  
        11. cout<<"Enter your favorite program language:";    
        12. cin.getline(pl,size);    
        13. cout<<"Hello "<<name<<", your favorite program language is "<<pl<<endl



        5.混合输入字符串和数字



        [cpp]  view plain copy


        1. int age = 0;  
        2. char address[size] = {0};  
        3.   
        4. cout<<"Enter your age:";  
        5. cin>>age;  
        6. cout<<"Enter your address:";  
        7. cin.getline(address,size);  
        8. cout<<"your age is "<<age <<", your address is "<<address<<endl;

        1.cin

        C++ 使用cin可以方便的读取键盘输入的字符,例如:



        [cpp]  view plain copy



          1. //test input  
          2. #include <iostream>                             
          3. int main()                                
          4. {                                         
          5. using namespace std;  
          6. const int size = 20;  
          7. char name[size];  
          8. char pl[size];//program language  
          9.   
          10. "Enter your name:";  
          11.     cin>>name;  
          12. "Enter your favorite program language:";  
          13.     cin>>pl;  
          14. "Hello "<<name<<", your favorite program language is "<<pl<<endl;  
          15. return 0;  
          16. }



          首先,每个输入我们只输入一个单词,如下:

          Android 获取输入法打开状态 读取输入法内容_ci_05

          但如果我们在第一个输入时填写两个以上单词:

          Android 获取输入法打开状态 读取输入法内容_ci_02

          可以发现,第二个输入还没来得及响应,就已经都显示出来了。

          原因是:cin通过使用空白(空格、制表符和换行符)来定字符串的界。这意味着cin在读取字符数组输入时只读取一个单词,读取该单词后,cin将该字符串放一数组中,并自动结尾添加空字符。另外,cin也没有很好的控件输入的字符数,即输入字符数大于数组大小的情况没有处理。

          2.cin.getline()

          基于上面的情况,使用cin.getline()读取一行数据。

          cin.getline()函数读取整行,它使用通过回车键输入的换行符来确定输入结尾。该函数有两个参数。第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数(包括空字符),cin.getline()成员函数在读取指定数目的字符或遇到换行符时停止读取

          如下:



          [cpp]  view plain copy


          1. cout<<"Enter your name:";  
          2. cin.getline(name,size);  
          3. cout<<"Enter your favorite program language:";  
          4. cin.getline(pl,size);  
          5. cout<<"Hello "<<name<<", your favorite program language is "<<pl<<endl;


          现在再来获得多个单词的输入:

          Android 获取输入法打开状态 读取输入法内容_ci_03

          发现就正常了。需要注意的是,cin.getline()丢弃了换行符。

          3.cin.get()

          get()函数有好几种变体,其中有一种与getline()完全相同的参数,但该函数不再读取并丢弃换行符(不读取意味着换行符还在输入队列中):



          [cpp]  view plain copy


          1. cout<<"Enter your name:";  
          2. cin.get(name,size);  
          3. cout<<"Enter your favorite program language:";  
          4. cin.get(pl,size);  
          5. cout<<"Hello "<<name<<", your favorite program language is "<<pl<<endl;


          尝试输入:

          Android 获取输入法打开状态 读取输入法内容_ci_04

          发现并不好使,原因是由于第一次调用后,换行符将留存输入队列中,因此第二次调用时看到的第一个字符为换行符。因此get认为已经到达行尾,而没有发现任何可读取的内容。get()(不带任何参数的变体)可以读取下一个字符(包括换行符)。因此可以:



          [cpp]  view plain copy

          1. cin.get(name,size).get();  
          2. cin.get(pl,size).get();


          即可。

          注意:有些C++版本没有不带参数的get()变体。可能有只有char参数的变体。可用下面的代替:

          char ch;cin.get(name,size).get(ch);

          4.读取空行和其他问题

          当getline()或get()读取空行时将如何?一般是下一条输入语句将在前一条结束读取的位置开始读取;但当有空行时,当get()读取空行后将设置失效位(failbit),这意味接下来的输入将被阻断,但可以用下面的命令来恢复输入:cin.clear()    cout<<"Enter your name:";  



          [cpp]  view plain copy


          1. cout<<"Enter your name:";    
          2. cin.get(name,size).get();    
          3. if (!cin)  
          4. {  
          5.     cin.clear();  
          6. while (cin.get()!='\n')  
          7.     {  
          8. continue;  
          9.     }  
          10. }  
          11. cout<<"Enter your favorite program language:";    
          12. cin.get(pl,size).get();    
          13. cout<<"Hello "<<name<<", your favorite program language is "<<pl<<endl;  
           另一个潜在的问题是,输入字符可能比分配的空间长。如果输入行包含的字符数比指定的多,则这get()和getline()将把余下的字符留在输入队列中,而getline()还会设置失效位,并关闭输入。




          [cpp]  view plain copy



            1. cout<<"Enter your name:";    
            2. cin.getline(name,size);    
            3. if (!cin)  
            4. {  
            5.     cin.clear();  
            6. while (cin.get()!='\n')  
            7.     {  
            8. continue;  
            9.     }  
            10. }  
            11. cout<<"Enter your favorite program language:";    
            12. cin.getline(pl,size);    
            13. cout<<"Hello "<<name<<", your favorite program language is "<<pl<<endl



            5.混合输入字符串和数字



            [cpp]  view plain copy


            1. int age = 0;  
            2. char address[size] = {0};  
            3.   
            4. cout<<"Enter your age:";  
            5. cin>>age;  
            6. cout<<"Enter your address:";  
            7. cin.getline(address,size);  
            8. cout<<"your age is "<<age <<", your address is "<<address<<endl;