C++中关于 getline() 读取缓冲区中回车,以及cin 结束符的问题

本文探讨了C++中cin与getline()函数的区别,特别是针对输入处理中的特殊字符如回车和空格的行为差异,并提供了代码示例说明如何避免常见陷阱。
部署运行你感兴趣的模型镜像

废话不多说直接上代码

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

输入“2” “回车” “asd”

运行结果是这样的:

可以看出当我输入2后按下回车,向下又自动跳了一行,也就是第一行和第三行之间空出来一行。然后输入“asd“输出asd,然后结束。

然后就发现一个问题,明明我输入的2应该输入两次,为什么输入完一次就over了呢?为什么多出来一行空格呢?

仔细查看上面的输入输出,运行结果可以看到 当我输入 2 之后自动的换了一次行,也就是str1已经输出了但是为空。

然后我又换了一种输入方式,又输入了一次,输入为“2 haha”   "回车"   “asd”运行结果如下:

所以得出结论cin>>的结束符,回车,或者空格都可以,但是当cin读取结束后,cin的结束符还会再缓冲区中存在,并让下次需要读取时进行读取

就拿第二次运行来说,当我输入2后有一个空格,缓冲区从2开始读取读取到空格后结束,但是空格并不做处理,留在缓冲区中做下一次使用,所以就造成了str1为“ haha”(haha前面有个空格),

所以可以看出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;
}

运行结果:

完美~~~

您可能感兴趣的与本文相关的镜像

AutoGPT

AutoGPT

AI应用

AutoGPT于2023年3月30日由游戏公司Significant Gravitas Ltd.的创始人Toran Bruce Richards发布,AutoGPT是一个AI agent(智能体),也是开源的应用程序,结合了GPT-4和GPT-3.5技术,给定自然语言的目标,它将尝试通过将其分解成子任务,并在自动循环中使用互联网和其他工具来实现这一目标

### C++ 中 `getline` 函数的使用方法 #### 1. 基本概念 `getline()` 是 C++ 标准库中的一个函数,主要用于从输入流中读取一行数据。它能够处理包含空格的字符串,这是与 `cin >>` 的主要区别之一[^1]。 #### 2. 函数原型 `getline()` 的基本原型如下: ```cpp istream& getline (istream& is, string& str); ``` 其中: - `is`: 输入流对象(通常是 `cin` 或文件流)。 - `str`: 存储读取到的数据的目标字符串(必须是 `std::string` 类型)。 还可以指定分隔符: ```cpp istream& getline (istream& is, string& str, char delim); ``` 这里 `delim` 参数指定了终止字符,默认情况下为 `\n`(换行符)[^4]。 --- #### 3. 示例代码 ##### 示例 1: 从标准输入读取一行 以下是一个简单的例子,展示如何通过 `getline()` 从键盘读取一行字符串: ```cpp #include <iostream> #include <string> using namespace std; int main() { string input; cout << "请输入一行文字:"; getline(cin, input); // 读取整个行,包括空格 cout << "您输入的是:" << input << endl; return 0; } ``` 此程序会等待用户输入并按回车键确认,随后打印完整的输入内容[^1]。 --- ##### 示例 2: 自定义分隔符 如果希望在特定字符处停止读取而不是等到换行符,则可以通过第三个参数来实现这一点: ```cpp #include <iostream> #include <string> using namespace std; int main() { string sentence; cout << "请输入一句话,以 '/' 结束:"; getline(cin, sentence, '/'); // 遇到 '/' 即停止读取 cout << "您输入的部分是:" << sentence << endl; return 0; } ``` 在这个例子中,当检测到 `/` 字符时就会结束当前行的读取操作[^4]。 --- ##### 示例 3: 文件读取 除了用于控制台交互外,`getline()` 还非常适合于逐行读取文件内容: ```cpp #include <fstream> #include <iostream> #include <string> using namespace std; int main() { ifstream file("example.txt"); if (!file.is_open()) { cerr << "无法打开文件!" << endl; return 1; } string line; while (getline(file, line)) { // 每次循环读取下一行直到EOF cout << line << endl; } file.close(); return 0; } ``` 这段代码展示了如何利用 `getline()` 来遍历文本文件中的每一行,并将其输出至屏幕[^3]。 --- #### 4. 注意事项 - 如果连续两次调用 `getline()` 而中间没有任何清理缓冲区的操作,可能会导致第二次调用立即返回空白结果。这是因为第一次调用可能已经消耗掉了剩余的换行符[^5]。 - 当使用带分隔符版本 (`char delim`) 的时候,请注意实际应用环境下的边界条件测试,比如是否存在非法或者意外提前出现的分割标记等问题。 --- ###
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值