C++(cin>>;cin.get();cin.getline();getline() ;gets())

在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 );

  1. is:istream类的输入流对象,譬如cin;
  2. str:待输入的string对象,表示把从输入流读入的字符串存放在这个字符串中(可以自己随便命名,str什么的都可以);
  3. 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标准中被删除。

猜你喜欢

转载自blog.csdn.net/baidu_34884208/article/details/87251832
今日推荐