星星博客 »  > 

OJ系统输入转为字符串char*或者std::string处理(力扣Leecode和牛客网 C++,std::getline,cin.getline)

主要用到输入函数std::getline(…)或者cin.getline(…)。由于std::getline(…)支持std::string输出,儿cin.getline(…)输出是char*,并且两者用法几乎一样,所以本文主要讲std::getline(…),简略说明一下cin.getline(…)用法就行。

一、std::getline原理和用法

1.1 std::getline参数解析

std::getline有两个版本,分别如下代码所示:

 // (1)
istream& getline (istream&  is, string& str, char delim);

 // (2)	
istream& getline (istream&  is, string& str);

1.1.1 istream& getline (istream& is, string& str, char delim)解析

其中第一个版本有三个参数,第一个参数是输入流,一般是输入std::cin;第二参数为输出到字符串str中;第三个为定界符delim,遇到定界符delim输入截止。
下面是其用法代码示例:

#include <iostream>
#include <string>

int main()
{
	using namespace std;
	string arrs;
	std::getline(std::cin, arrs, '#');
	cout << arrs << endl;

	return 0;
}

输出结果图
在这里插入图片描述
由此可见,输入终止的条件是遇到定界符delim,否则换行符也无法终止输入,只有遇到定界符delim才会结束输入。

1.1.2 istream& getline (istream& is, string& str)解析

另一个版本有两个参数,第一个参数是输入流,一般是输入std::cin;第二参数为输出到字符串str中;第三个参数没有,但是代码实现默认为换行符了’\n’,所以该版本无法输出换行符。
下面是其用法代码示例:

#include <iostream>
#include <string>

int main()
{
	using namespace std;
	string arrs;
	std::getline(std::cin, arrs);
	cout << arrs << endl;

	return 0;
}

输出结果图
在这里插入图片描述
由此可见,一敲入换行符,则输入截止,而上面版本三个参数的则是遇到指定的定界符delim才终止输入。

二、cin.getline原理和用法

由下面代码可知,cin.getline(…)函数其实调用的是基类成员方法std::istream::getline(…)。

istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );

cin.getline(…)也是有两个版本,用法跟上面的差不多,参数从左到右依次为输出到字符串s,输出字符串内容大小n,定界符delim。
下面是一个简单示例用法:

#include <iostream>
#include <string>
int main()
{
    using namespace std;
    // 获取输入字符串 " 22 11 66 44 88 "
    const int BUFF_LEN = 256; // 缓冲区长度
    char buff[BUFF_LEN] = { 0 };
    cin.getline(buff, BUFF_LEN, '\n');
    string str(buff);
    cout << str;

    return 1;
}

输出结果:
在这里插入图片描述
由图可见,同样遇到定界符delim时终止输入,但是输出缓冲变量是char*,而不是std::string。

三、参考内容

std::getline (string)
std::istream::getline

相关文章