C++14后如何读入一行带空格的一行字符串

前文:
在c++11标准及之前,仍可以使用gets读入,但是c++14正式删除了gets这一不安全的读入。由于读入对空格的自动忽略,所以需要其他读入函数来处理带空格的字符串。

具体读入方式:

一、字符数组


A、std::cin.getline(str, size)

#include<iostream>
int main() {
    
    
	char str[100];
	std::cin.getline(str, 100);
	std::cout << str << "\n";
	return 0;
}

表示你可以从索引 0 0 0开始读入至多 99 99 99个字符,最后一个留给'\0'
getline遇到换行后,会停止继续读入并且过滤掉换行。


B、std::cin.get(str, size)

#include<iostream>
int main() {
    
    
	char str[100];
	std::cin.get(str, 100);
	std::cout << str << "\n";
	return 0;
}

注意:
cin.get()cin.get(str, size)
cin.get()可以读入任何字符
cin.get(str, size)不能过滤换行,即遇到换行符就结束读入,并且换行符仍然会丢在缓冲区。

如下程序一个停留在缓冲区的换行符将会使得下面的所有get读入都失效。

#include<iostream>
#include<cstring>
using namespace std;

int main()
{
    
    
	char s1[10], s2[10], s3[10];
	cin.get(s1, 10);
	cin.get(s2, 10);
	cin.get(s3, 10);
	cout << strlen(s1) << " : "<< s1 << "\n";
	cout << strlen(s2) << " : "<< s2 << "\n";
	cout << strlen(s3) << " : "<< s3 << "\n";
	return 0;
}

输出:

100
3 : 100
0 :
0 :

解决办法:在get读入完成后再用一次get将换行手动过滤掉:
cin.get(str, 100).get();


C、scanf("%[^\n]", str)

get类似,也不会过滤换行:具体操作如下。

#include<cstdio>
int main()
{
    
    
	char str[100];
	scanf("%[^\n]", str); getchar();
	printf("%s\n", str);
	return 0;
}

为了保证不出类似的错误,建议所有的scanf后都跟一个getchar过滤换行符。


D、fgets(str, size, stdin)

为了解决gets的读入安全问题,fgets中添加了读入的最长长度size,不过fgets会读入换行符。如下:

#include<cstdio>
#include<cstring>
using namespace std;

int main()
{
    
    
	char str[10];
	fgets(str, 10, stdin);
	for(int i = 0; i < strlen(str); ++i) {
    
    
		if(str[i] == '\n') printf("x");
		else printf("%c", str[i]);
	}
	return 0;
}

运行结果:

input:
123

output:
123x

所以如果不需要的换行符时可以str[strlen(str)-1]='\0'将换行符去除。


二、string

A、getline(std::cin, s)

#include<iostream>
#include<string>
int main()
{
    
    
	std::string s;
	getline(std::cin, s);
	std::cout << s << "\n";
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43900869/article/details/114308096