在c++中,有多种输入方法,本文略作总结。
程序的输入都有一个输入缓冲区。输入过程中,一次键盘输入结束时会立即将输入的数据存入输入缓冲区,cin函数则直接从输入缓冲区中取数据,当缓冲区有残留的数据时,cin函数会直接取得这些残留数据,而不会请求输入。
#include <iostream>
using namespace std;
int main( ) {
string str;
cout<<"Test"<<endl;
cin>>str;
cout<<str<<endl;
cin>>str;
cout<<str<<endl;
return 0;
}
键盘键入A【空格】B【回车】,直接输出A【第一行】、B【第二行】。
由于cin在遇到空格时,就会停止输入。所以第一句{cin>>str;}只会读取前一个字符串A,空格结束,此时输入缓冲区还保留着第二个字符串B,第二句{cin>>str;}直接从缓冲区取字符串B,而不请求输入,直接输出。
函数cin.sync()可以清空输入缓冲区。
#include <iostream>
using namespace std;
int main( ) {
string str;
cout<<"Test"<<endl;
cin>>str;
cin.sync();
cout<<str<<endl;
cin>>str;
cout<<str<<endl;
return 0;
}
键盘输入apple【空格】blue【回车】,输出apple;再次键盘输入come【回车】,输出come。
由于cin在遇到空格时,就会停止输入。所以第一句{cin>>str;}只会读取前一个字符串apple,空格结束,此时输入缓冲区还保留着第二个字符串blue;函数{cin.sync()}清除此时缓冲区保留的字符串blue;请求第二次输入{cin>>str;},获取字符串come并输出。
1、cin>>
标准输入流
类istream的对象,表示面向窄字符(char类型)的标准输入流。 它对应于C流标准输入。
标准输入流是由环境确定的字符源。 通常假设是从外部源输入,例如键盘或文件。
作为类istream的对象,可以使用提取运算符(operator >>)将字符检索为格式化数据,也可以使用成员函数(如read)检索字符作为无格式数据。
该对象在头文件中声明,具有外部链接和静态持续时间:它持续整个程序的持续时间。
用法1:输入一个数字:
#include <iostream>
using namespace std;
int main() {
int number;
cout << "输入一个整数: ";
cin >> number;
cout << "输入的数字为: " << number;
return 0;
}
用法2:输入一个字符串,遇【空格】、【TAB】、【回车】都结束
#include <iostream>
using namespace std;
int main( )
{
char name[50];
cout << "请输入您的名称: ";
cin >> name;
cout << "您的名称是: " << name << endl;
return 0;
}
2、cin.get()
cin.get() 函数是内置在 cin 对象中的,所以可称之为 cin 的一个成员函数。
get( char*, int, char );
get( char& );
cin.get() 成员函数读取单个字符,包括任何白色空格字符 。
cin.get (ch);
ch = cin.get();
在上面两个例子中,假设 cin 是正被读入字符的 char 变量的名称;如果程序正在使用 cin.get() 函数简单地暂停屏幕直到按回车键,并且不需要存储字符,则该函数也可以如下调用:
cin.get();
用法展示:
#include <iostream>
using namespace std;
int main( ) {
char ch;
cout << "This program has paused. Press Enter to continue.";
cin.get(ch);
cout << "It has paused a second time. Please press Enter again.";
ch = cin.get();
cout << "It has paused a third time. Please press Enter again.";
cin.get();
cout << "Thank you!\n";
return 0;
}
正是因为函数简单地暂停屏幕直到按回车键,使运行开始首先输出第一行,键入【回车】输出第二行,再【回车】输出第三行,再【回车】输出第四行。
用法1: cin.get(字符变量名)可以用来接收字符
#include <iostream>
using namespace std;
int main( ) {
char ch;
ch=cin.get(); //或者cin.get(ch);
cout<<ch<<endl;
return 0;
}
输入:abcde;输出:a。
用法2:cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格
#include <iostream>
using namespace std;
int main( ) {
char ch[10];
cin.get(ch,10);
cout<<ch<<endl;
return 0;
}
输入:ab cd ef;输出:ab cd ef。
输入:abcdefghijklmno(输入15个字符)
输出:abcdefghi(接收9个字符+1个’ \0 ')
用法3:cin.get(无参数),没有参数主要是用于舍弃输入流中的不需要的字符,或者舍弃回车,弥补cin.get(字符数组名,接收字符数目)的不足.
混用使用cin>>和cin.get()
#include <iostream>
using namespace std;
int main( ) {
char ch;
int number;
cout<<"Enter a number"<<endl;
cin>>number;
cout<<"Enter a character"<<endl;;
ch=cin.get();
cout<<"Thank you!"<<endl;
return 0;
}
当{cin>>number;}读取输入的数据时,遇到换行符则停止,所以换行符未被读取,仍保留在输入缓冲区中。执行{ch=cin.get();}时,开始从先前输入操作停止的缓冲区读取,并发现了换行符,因此无须请求输入。可似使用cin.ignore函数解决该问题。
3、cin.getline() // 接受一个字符串,可以接收空格并输出
cin.getline()是cin的一个成员函数,属于istream流,定义在头文件iostream中。
cin.getline(char ch[],size);//用于输入行指定size的字符串,以enter结束。若输入长度超出size,则不再接受后续的输入。
cin.getline() 函数使用两个用逗号分隔的参数。第一个参数是要存储字符串的数组的名称。第二个参数是数组的大小。当 cin.getline() 语句执行时,cin 读取的字符数将比该数字少一个,为 null 终止符留出空间。这样就不需要使用 setw 操作符或 width 函数。以上语句最多可读取 (size-1) 个字符,null 终止符将自动放在数组最后一个字符的后面。
#include <iostream>
using namespace std;
const int SIZE=8;
int main( ) {
char ch[SIZE];
cout<<"Enter a sentence."<<endl;
cin.getline(ch,SIZE);
cout<<"Your sentence is "<<ch<<endl;
return 0;
}
输入:12345678【回车】;输出1234567
输入:12 34 56 78【回车】;输出12 34 5;
cin.getline()实际上有三个参数,cin.getline(接受字符串,接受个数,结束字符) 当第三个参数省略时,系统默认为’\0’ 如果将例子中cin.getline()改为cin.getline(ch,SIZE,’a’);当输入12a345678时输出12。
当用在多维数组中的时候,也可以用cin.getline(m[i],20)之类的用法:
#include <iostream>
using namespace std;
int main( ) {
char ch[3][20];
for(int i=0;i<3;i++){
cout<<"请输入第"<<i+1<<"个字符串"<<endl;
cin.getline(ch[i],20);
}
for(int i=0;i<3;i++){
cout<<"输出ch["<<i<<"]的值"<<ch[i]<<endl;
}
return 0;
}
4、getline() // 接受一个字符串,可以接收空格并输出,需包含“#include”
getline()属于string流,定义在头文件string中,用于输入一行string,以enter结束。
函数原型:istream& getline ( istream &is , string &str , char delim );
- is:istream类的输入流对象,譬如cin;
- str:待输入的string对象,表示把从输入流读入的字符串存放在这个字符串中(可以自己随便命名,str什么的都可以);
- delim:表示遇到这个字符停止读入,在不设置的情况下系统默认该字符为’\n’,也就是回车换行符(遇到回车停止读入)。
#include <iostream>
#include <string>
using namespace std;
int main( ) {
string Fstr,Sstr,Tstr;
cout<<"First string:"<<endl;
getline(cin,Fstr);
cout<<"Second string:"<<endl;
getline(cin,Sstr);
cout<<"Third string:"<<endl;
getline(cin,Tstr,'#');
cout<<"First str:"<<Fstr<<endl;
cout<<"Second Sstr:"<<Sstr<<endl;
cout<<"Third Sstr:"<<Tstr<<endl;
return 0;
}
5、gets() // 接受一个字符串,可以接收空格并输出,需包含“#include”
gets函数原型:chargets(charbuffer);//读取字符到数组:gets(str);str为数组名。
gets函数功能:从键盘上输入字符,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。
读取的换行符被转换为null值,做为字符数组的最后一个字符,来结束字符串。
注意:gets函数由于没有指定输入字符大小,所以会无限读取,一旦输入的字符大于数组长度,就会发生内存越界, 从而造成程序崩溃或其他数据的错误。
#include<iostream>
#include <string>
using namespace std;
int main( ) {
char ch1[20];
char ch2[20];
gets(ch1);
cout<<ch1<<endl;
gets(ch2);
cout<<ch2<<endl;
return 0;
}
输入:abcd;输出:abcd
输入:a b c d;输出:a b c d
gets()函数用来从标准输入设备(键盘)读取字符串直到换行符结束,但换行符会被丢弃,然后在末尾添加’\0’字符。也就是说:gets()函数读取到\n(我们输入的回车)于是停止读取,但是它不会把\n包含到字符串里面去。然而,和它配合使用的puts函数,却在输出字符串的时候自动换行。在C11标准中被删除。