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. }
首先,每个输入我们只输入一个单词,如下:
但如果我们在第一个输入时填写两个以上单词:
可以发现,第二个输入还没来得及响应,就已经都显示出来了。
原因是: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;
现在再来获得多个单词的输入:
发现就正常了。需要注意的是,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;
尝试输入:
发现并不好使,原因是由于第一次调用后,换行符将留存输入队列中,因此第二次调用时看到的第一个字符为换行符。因此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. }
首先,每个输入我们只输入一个单词,如下:
但如果我们在第一个输入时填写两个以上单词:
可以发现,第二个输入还没来得及响应,就已经都显示出来了。
原因是: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;
现在再来获得多个单词的输入:
发现就正常了。需要注意的是,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;
尝试输入:
发现并不好使,原因是由于第一次调用后,换行符将留存输入队列中,因此第二次调用时看到的第一个字符为换行符。因此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;