如何使用getline()接收多个字符串输入,解决无法触发第二次输入问题
问题根源
你遇到的问题核心和cin.getline()或者cin.ignore()无关,是代码里存在野指针的非法访问:
- 你定义的
Node *test只是一个指向Node类型的指针,没有给它分配实际存储Node对象的内存空间,直接访问test->str_1属于未定义行为,运行时会出现各种不可预期的异常,比如跳过输入、程序崩溃等。
最简修复方案
不需要用指针的场景下,直接在栈上创建Node对象即可,这对新手来说最安全,不需要手动管理内存:
#include <iostream> #include <cstring> using namespace std; class Node{ public: char str_1[25]; char str_2[25]; }; int main(){ // 改为栈上的对象,自动分配内存 Node test; cout << "Str_1: "; cin.getline(test.str_1, 25); cout << "Str_2: "; cin.getline(test.str_2, 25); // 可以加输出验证结果 cout << "\n输入的内容为:" << endl; cout << "str_1: " << test.str_1 << endl; cout << "str_2: " << test.str_2 << endl; return 0; }
如果必须使用指针的写法
需要先给指针分配对应的堆内存,使用完后记得释放避免内存泄漏:
#include <iostream> #include <cstring> using namespace std; class Node{ public: char str_1[25]; char str_2[25]; }; int main(){ // 给指针分配Node大小的内存 Node *test = new Node(); cout << "Str_1: "; cin.getline(test->str_1, 25); cout << "Str_2: "; cin.getline(test->str_2, 25); cout << "\n输入的内容为:" << endl; cout << "str_1: " << test->str_1 << endl; cout << "str_2: " << test->str_2 << endl; // 释放内存 delete test; return 0; }
补充说明
cin.ignore()的使用场景 只有当你之前用cin >> 变量这类不会吃掉输入末尾换行符的输入方式时,才需要在调用getline之前加cin.ignore()清空缓冲区残留的换行符,避免getline读到空内容。你当前的场景全程用getline接收输入,不需要加ignore语句。
内容的提问来源于stack exchange,提问作者Tanmay Sharma
相关产品推荐
相关产品推荐

