C++最全输入方式总结(cin、get、getchar、getline)

目录

写在前面:

一、输入方式

1.cin>>

2.cin.get()

3.cin.getline()

下面介绍几个string的输入:

4.getline()

5.gets()

6.getchar()

二、输入控制

三、例子


写在前面:

主要注意的包括以下几个点(重要性不分先后):

1.输入参数

2.结束标志

3.是否会将没输入的继续放在输入流

4.返回值

5.针对字符、数字及字符、字符串的哪种情况

一、输入方式

1.cin>>

1)最常见的是获取输入的一个字符数字(后面会介绍只输入字符的情况),如

int a,b;

cin>>a>>b;

注意:cin>>会自动过滤掉不可见字符(如空格 回车 tab等)。

若不想过滤掉空白字符,可以用noskipws流进行控制。如下程序,没有过滤掉不可见字符,输入的空格字符存入了input[1]中,也可输出。

#include<iostream>
using namespace std;
int main()
{
	int input[5];
	for (int i = 0; i < 5; i++) 
		cin >> noskipws >> input[i];
	for (int i = 0; i < 5; i++)
		cout << input[i] << endl;
	system("pause");
	return 0;
}

2)获取输入的字符串,可以用数组或string类型。如

char a[20];

cin>>a;

cout<<a<<endl;

或者string类型:

string s;

cin>>s;

cout<<s<<endl;

 注意:遇到空格、回车等会结束获取输入的字符串,后面的字符串会过滤掉(存放在输入流中)。如果后面还需要输入字符串,则会从前面存放的字符串开始获取。

比如将输入存在一个数组中,中途若遇见空格,则只会将空格前面的内容放入数组。

#include <bits/stdc++.h>
using namespace std;


int main()
{
	int c[20];
	cin >> c;
	cout << c;
	system("pause");
	return 0;
}

2.cin.get()

此函数从输入流中读入一个字符(char 非int,如果定义数组或变量为int就会出错!),返回值就是该字符的 ASCII 码。如果碰到输入的末尾,则返回值为 EOF。
EOF 是 End of File 的缩写。istream 类中从输入流(包括文件)中读取数据的成员函数,在把输入数据都读取完后再进行读取,就会返回 EOF。EOF 是在 iostream 类中定义的一个整型常量,值为 -1。
get() 函数不会跳过空格、制表符、回车等特殊字符,所有的字符都能被读入。

1)cin.get(字符变量名),用来接收字符,只获取一个字符,可以接收空格,遇回车结束

#include <bits/stdc++.h>
using namespace std;


int main()
{
	char c[20];
	for (int i = 0; i < 20; i++)
		cin.get(c[i]);
	for(int i =0; i < 20; i++)
	cout << c[i];
	system("pause");
	return 0;
}

2)cin.get(数组名,接收字符数目),用来接收字符串,可以接收空格,遇回车结束。

注意:数组的最后一个字符会是‘\0’,设接收字符数目为n,如果输入的字符串大于等于n,则实际接收到的输入是字符串的前面n-1个字符,包括空格(不包括回车,遇到回车就结束了),会自动在后面增加一个‘\0’。所以预设数组大小时要比实际输入大小大1.

注意:此时不需要循环输入了!!!

#include <bits/stdc++.h>
using namespace std;


int main()
{
	char c[3];
	cin.get(c, 3);
	cout << c;    //输出只会有2个 因为结尾占位了
	system("pause");
	return 0;
}

3)cin.get(),没有参数,主要用于舍弃输入流中不需要的字符,或者舍弃回车,即舍弃输入流中的一个字符(注意!是紧接着的一个字符!)

#include <bits/stdc++.h>
using namespace std;


int main()
{
	char c[3], d[2];
	cin.get(c, 3);
	cin.get(d, 2);
	cout << c << endl;
	cout << d<< endl;
	system("pause");
	return 0;
}

没有用cin.get(),则后面的3会从输入流中继续读入

有cin.get(),则2后面的3被省略了。

#include <bits/stdc++.h>
using namespace std;


int main()
{
	char c[3], d[2];
	cin.get(c, 3);
	cin.get();
	cin.get(d, 2);
	cout << c << endl;
	cout << d<< endl;
	system("pause");
	return 0;
}

3.cin.getline()

注意:这是读取字符!后面还会介绍getline读取字符串!别搞混了。

getline() 是 istream 类的成员函数,它有如下两个重载版本:

istream & getline(char* buf, int bufSize);
istream & getline(char* buf, int bufSize, char delim);

第一个版本从输入流中读取 bufSize-1 个字符到缓冲区 buf,或遇到\n为止(哪个条件先满足就按哪个执行)。函数会自动在 buf 中读入数据的结尾添加\0

第二个版本和第一个版本的区别在于,第一个版本是读到\n为止,第二个版本是读到 delim 字符为止。\n或 delim 都不会被读入 buf,但会被从输入流中取走。

这两个函数的返回值就是函数所作用的对象的引用。如果输入流中\n或 delim 之前的字符个数达到或超过 bufSize,就会导致读入出错,其结果是:虽然本次读入已经完成,但是之后的读入都会失败。

从输入流中读入一行,可以用第一个版本。用cin >> str这种写法是不行的,因为此种读法在碰到行中的空格或制表符时就会停止,因此就不能保证 str 中读入的是整行。

总结来说就是,接收一个字符串,可以接收空格等,最后一个字符为‘\0’。结束符可以通过设置第三个参数自己设置,默认是回车。m不能为string类型。

经常会遇到需要从输入流中读入一行的情况,可以用第一个版本,因为以回车符为结束标志。用cin >> str这种写法是不行的,因为此种读法在碰到行中的空格或制表符时就会停止,因此就不能保证 str 中读入的是整行。

1)cin.getline(变量名, 输入大小)默认结束方式

#include <bits/stdc++.h>
using namespace std;


int main()
{
	char c[3];
	cin.getline(c, 3);
	cout << c << endl;
	system("pause");
	return 0;
}

2)自定义结束标志

#include <bits/stdc++.h>
using namespace std;


int main()
{
	char c[5];
	cin.getline(c, 5, '3');
	cout << c << endl;
	system("pause");
	return 0;
}

下面介绍几个string的输入:

4.getline()

注意:这不是cin.getline() !!!!!.

用于string类的。使用需包含头文件#include<string>。getline(cin,string s),接收一个字符串,可以接收空格、回车等

与cin.getline()的区别:

              1.cin.getline()接收输入字符串的是数组,getline()是string类型。

              2.cin.getline()可以接收空格,但不能接收回车;getline()可以接收空格和回车

              3.cin.getline()会在数组结尾是'\0',getline()不会

// This program illustrates using the getline function
//to read character data into a string object.
#include <iostream>
#include <string> // Header file needed to use string objects
using namespace std;

int main()
{
    string name;
    getline(cin, name);
    cout << name << endl;
    return 0;
}

虽然getline也用了cin,但是他们存在区别:

cin与getline()的区别:

               getline()中的结束符,结束后,结束符不放入缓存区;

               cin的结束符,结束后,结束符还在缓存区;

 所以在使用 cin 后若要使用 getline() 必须要把前面cin遗留的结束符处理掉,解决方法为:在使用getline()之前,加入一行getline()来处理cin留下的结束符;代码如下:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    string str1;
    int x;cin>>x;
    getline(cin,str1);
    while(x--){
        getline(cin,str1);
        cout<<str1<<"\n";
    }
    return 0;
}

5.gets()

gets(m)用于string类的,需包含#include<string>。可以接收空格,遇回车结束。

#include <iostream>
#include <cstring>//必须是cstring,否则strlen()方法不能用
#include <stdio.h>
using namespace std;

int main()
{
    char a[40000];
    gets(a);//必须是char型数组,不能是其他类型数组
    int len=strlen(a);//得到char型数组的实际长度
    //执行其余操作
    return 0;
}

可用于多维数组。

  #include<iostream>
  #include<string>
  using namespace std;
  main ()
  {
      char m[3][20];
	    for (int i = 0; i < 3; i++)
	    {
		    cout << "\n请输入第" << i + 1 << "个字符串:" << endl;
		    gets_s(m[i]);
	    }
	    cout << endl;
	    for (int j = 0; j < 3; j++) {
		    int len = strlen(m[j]);//得到char型数组的实际长度
		    for (int k = 0; k < len; k++)
			    cout << "输出m[" << j << k << "]的值:" << m[j][k] << endl;
	    }
  }

6.getchar()

 m=getchar(),需包含#include<string>

getchar()是C语言中的函数,C++中也包含了该函数。getchar()函数的作用是从标准的输入stdin中读取字符。也就是说,getchar()函数以字符为单位对输入的数据进行读取。

在控制台中通过键盘输入数据时,以回车键作为结束标志。当输入结束后,键盘输入的数据连同回车键一起被输入到输入缓冲区中。在程序中第一次调用getchar()函数从输入缓冲区中读取一个字节的数据。需要注意的是,如果此时在程序中第二次调用getchar()函数,因为此时输入缓冲区中还有回车键的数据没有被读出,第二个getchar()函数读出的是回车符。

getchar( )只能接收一个字符。getchar函数得到的字符可以赋给一个字符变量或整型变量,也可以不赋给任何变量,作为表达式的一部分。通常可以用它来解决多行输入时存在的回车符(从流中取走回车符)

#include <stdio.h>
#include<ctype.h>
int main() {
    int N;
	int num[10000];
	int j = 0;
	do {    //因为第一个是数字 第二个才是空格,所以用do 不然会丢失第一个数
		scanf_s("%d", &num[j++]);
	} while (getchar() != '\n');
 
	scanf_s("%d", &N);
	for (int i = 0; i < j; i++) {
		printf("%d ", num[i]);
	}
	return 0;
}

二、输入控制

比如输入进制控制:

https://blog.csdn.net/qq_41687938/article/details/116713651?spm=1001.2014.3001.5501

其他一些十分经典的使用方法及实例。

https://blog.csdn.net/qq_41687938/article/details/116535989?spm=1001.2014.3001.5501

三、例子

https://blog.csdn.net/qq_41687938/article/details/116535989?spm=1001.2014.3001.5501

  • 78
    点赞
  • 478
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子木呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值