目录

  • 控制台输入
    • c
      • scanf
      • getchar( )
      • getline( )
    • c++
      • cin
      • string 类:getline
      • cin.get( )
  • 控制台输出
    • c
      • printf
      • put
    • c++
      + cout
      +

缓冲区

在键盘输入如:
absd skd! skdjf-skjdfk<回车>
每一个字符在电脑中都会用asic码进行存储
当读入到<回车>时,整个一行将会存入缓冲区
代码里写的cin等都是从缓冲区拿

string类:getline

getline()函数的定义如下所示

  	+ istream& getline ( istream &is , string &str , char delim )
  	+ istream& getline ( istream &is , string &str )

is 进行读入操作的输入流
str 用来存储读入的内容,注意是string类,而不是字符数组的指针
delim 终结符,遇到该字符停止读取操作,不写的话默认为回车(需要注意缓冲区的遗留)
注意问题1:
getline会处理读入的回车字符(默认),将其从缓冲区取走,但是并不存入string对象里,如果缓冲区只剩下一个‘\r’,getline会读走这个回车,string类对象仍为空
注意问题2:
可以看到getline返回的是一个istream的对象,所以可以继续进行对于istream对象的操作,并且,返回有值,当输入文件终止符时,getline返回值为1
实例代码:

#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main() {
	int n = 0;
	cin >> n;
	vector<string> arr(n);
	for (int i = 0; i < n; i++) {
		getline(cin, arr[i]);
	}
	for (int i = 0; i < n; i++) {
		cout << i << arr[i] << endl;
	}
	return 0;
}

getline示意
运行结果如上,可以看到,我输入2之后的回车,跟着2进入了缓冲区,cin读取了2并赋值给n,第一次的getline读取到的就是第一个回车前的空,(并且并没有读入这个回车,因为如果读入了输出应该有额外的一个空行)
那么如果在两次getline后,cin会读到什么:

int k;
	cin >> k;
	cout << k;

cin在getline中示意
所以cin实际上是舍弃了缓冲区留下的那个回车,继续等待键盘的输入的

c语言中getline

头文件istream中

	istream& getline (char* s, streamsize n );//读取最多n个字符保存在s对应的数组中,即使大小不够n,
	istream& getline (char* s, streamsize n, char delim ); //读取最多n个字符保存在s对应的数组中,遇到delim,或者读完一行,或字数达到限制则终止

此时需要注意的就是,这是字符数组,需要有结束字符的位置
示例代码

#include<iostream>
using namespace std;
int main() {
	char a[5];
	cin.getline(a, 3);
	char x, y;
	cin >> x >> y;
	cout << x << y << endl;
	cout << a << endl;
	return 0;
}

错误示范
竟然出现了烫!!
那么分析一下,我只输入了abcde五个字符,缓冲区是abcde加一个回车,那么cin.getline(a, 3);读入的是ab因为第三个位置留给了结束字符,缓冲区剩下的是cde,被两个cin读取,又因为读取的形式是char型,所以出现了非法字符
更改如下:

char a[5];
	cin.getline(a, 5);
	char x, y;
	cin >> x >> y;
	cout << x << "11111" << y << "11111"<<endl;
	cout << a << endl;
	return 0;

案例一
十分完美,只读入了abc是因为没有到达位数就遇见了默认终止回车
案例二
案例三

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐