cin对象详解
int main() {
int a, b;
while (cin >> a >> b) { // 注意 while 处理多个 case
cout << a + b << endl;
}
// cin >> a >> b;
// cout << a + b << endl;
}
cin只有得到换行符才会开始从缓冲区读取
cin读取的时候,忽略遇到第一个字符前的分隔符,逐个读取
以上代码需注意:
- 缓冲区的数据输入后(例如“ fd 5 4 3 6 ”),由回车结束,然后cin开始读取
- cin从缓冲区读取数据,忽略缓冲区最前面的空格、tab、回车等分隔符
- 在此后读取缓冲区的数据,直到遇到第一个分隔符,则第一个数据读取完毕
- cin可以连续读取,这里cin了a后又遇到>>b,所以之后继续忽略分隔符,读取下一个数据(这时候a已经获得取值,b还没有),此时会检查a的数据类型,不符合则返回false,从而退出while循环)
- (这里就是a=fd,b=未知,退出循环)
- 如果此处数据符合要求,没有退出while循环,则继续在缓冲区中读取得(a=4,b=3,打印7)
- 继续读取
- (a=6,然后缓冲区没有数据【只有空格,是分隔符】,等待输入)
- 如果这里a不是6,而是字符
- 那么由于这里a的类型错误,返回false,while循环退出,不会再等待输入b
cin.get()函数
int main()
{
int cur_sum = 0;
int x;
while (cin >> x)
{
cur_sum += x;
if (cin.get() == '\n')
{
cout << cur_sum << endl;
cur_sum = 0;
}
}
return 0;
}
以上代码是一个循环,用于从标准输入(键盘)读取一系列整数,并在每行输入结束后(通过cin.get()判断)输出当前行的累加和。
-
cin.get()是 C++ 标准库中用于从标准输入(通常是键盘)读取单个字符的函数 -
if (cin.get() == '\n'): 在读取完一个整数后,使用cin.get()函数尝试读取一个字符。如果读取的字符是换行符\n,则表示当前行输入结束。
getline()函数
#include <iostream>
#include <vector>
#include <algorithm>
#include <sstream> // Include this header for stringstream
int main() {
std::string input;
while (getline(std::cin, input)) { // 逐行读取输入
std::vector<std::string> strs; // 存储分隔后的字符串
std::string str; // 用于临时存储每个分隔的字符串
std::stringstream ss(input); // 用于分隔字符串的字符串流
// 分隔逗号分隔的字符串并存储在 strs 向量中
while (getline(ss, str, ',')) {
strs.push_back(str);
}
// 对分隔后的字符串进行排序
std::sort(strs.begin(), strs.end());
// 输出排序后的字符串
for (auto& str : strs) {
std::cout << str << " ";
}
std::cout << std::endl;
}
return 0;
}
以上代码是一个用于从标准输入逐行读取逗号分隔的字符串,然后对每行的字符串进行排序并输出的程序。
解释步骤:
getline(std::cin, input): 这一行通过getline函数从标准输入中逐行读取输入并存储在input字符串中。循环会一直进行,直到达到文件结束或遇到错误。std::vector<std::string> strs;: 在每次循环迭代开始时,创建一个空的字符串向量strs用于存储分隔后的字符串。std::string str;: 这是一个临时的字符串变量,用于在分隔字符串时暂存每个分隔的部分。std::stringstream ss(input);: 使用std::stringstream对象ss,将刚刚读取的input字符串转换为一个字符串流,这样我们就可以方便地分隔其中的内容。while (getline(ss, str, ',')) { ... }: 这个循环通过getline函数从ss字符串流中逐个读取以逗号为分隔符的部分,将每个部分存储在str中,然后将其推入strs向量中。std::sort(strs.begin(), strs.end());: 使用std::sort函数对strs中的字符串进行排序,使其按字母顺序排列。输出排序后的字符串:使用循环遍历
strs向量中的每个字符串,并将其输出到标准输出。std::cout << std::endl;: 在每次内部循环结束后,换行以准备处理下一行输入。
getline()函数详解
getline 是 C++ 标准库中的一个函数,用于从输入流中读取一行文本。它的函数签名如下:
istream& getline(istream& is, string& str, char delim = '\n');
这个函数的目的是从输入流(如标准输入、文件流等)读取文本,直到遇到指定的分隔符(默认是换行符 \n)为止,然后将读取的文本存储在指定的字符串 str 中。getline 函数的返回值是输入流对象的引用,通常是 cin 或文件流对象。
下面是关于 getline 函数的详细说明:
参数:
-
is:表示输入流对象(例如cin或文件流)。 -
str:用于存储读取的文本的字符串对象的引用。 -
delim:可选参数,表示分隔符,默认为换行符\n。当读取到该字符时,读取操作会停止。
getline()函数注意事项
#include <iostream>
#include <vector>
#include <string>
int main() {
int t;
std::cin >> t;
std::cin.ignore(); // 消耗换行符
std::vector<std::string> a;
for (int i = 0; i < 2 * t; ++i) {
std::string temp;
std::getline(std::cin, temp);
a.push_back(temp);
}
for (const auto& str : a) {
std::cout << str << std::endl;
}
return 0;
}
以上代码,getline之前必须加入std::cin.ignore();忽略输入t后的换行符。否则在读取 t 后,输入缓冲区中还有一个换行符(\n)残留,而在之后的 getline 中,第一个 getline读取了这个空行,导致a[0]为空