You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中cin.get()读取含空格字符数组时输入异常的解决咨询

问题:使用cin.get()读取含空格的字符串时程序提前终止

我编写了如下C++代码:

#define MAX 100 // 假设MAX是定义过的常量
int main(){ 
    char str1[MAX], str2[MAX]; 
    cout <<" 1st string: "; 
    cin.get(str1, MAX); 
    cout <<" 2nd string: "; 
    cin.get(str2, MAX); 
    cout << str1 << str2; 
    return 0; 
}

我尝试为两个字符数组str1和str2输入包含空格的字符串,但程序在完成第一个输入后就终止了。输出界面显示:

1st string : abc def

当我按下回车准备输入第二个数组时,程序直接终止,仅显示第一个字符串,输出内容为:

2nd string
abc def

请问如何正确使用cin.get()函数实现两次输入?是否有其他方法可以读取包含空格的字符数组?


解答

嘿,这个问题我之前也踩过坑!核心原因是输入缓冲区里残留的换行符在搞鬼:

当你输入abc def然后按回车,cin.get(str1, MAX)会把换行符之前的所有字符(也就是abc def)读到str1里,但那个换行符\n还留在输入缓冲区里没被处理。接下来调用cin.get(str2, MAX)的时候,它一看到缓冲区里的换行符,就直接认为输入结束了,根本不会等你输入第二个字符串,所以str2是空的,程序直接跳去输出然后退出了。

下面给你几个靠谱的解决办法:

1. 手动清理缓冲区的换行符

在第一次cin.get()之后,用cin.ignore()把缓冲区里的换行符(以及可能残留的其他字符)清掉,这样第二次cin.get()就能正常接收输入了:

#define MAX 100
#include <iostream>
#include <limits> // 要包含这个头文件使用numeric_limits

int main(){ 
    char str1[MAX], str2[MAX]; 
    std::cout <<" 1st string: "; 
    std::cin.get(str1, MAX); 
    // 跳过缓冲区里直到换行的所有字符,确保缓冲区干净
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    std::cout <<" 2nd string: "; 
    std::cin.get(str2, MAX); 
    std::cout << str1 << "\n" << str2; 
    return 0; 
}

要是不想加<limits>头文件,也可以直接写std::cin.ignore(1000, '\n'),只要数字足够大,能覆盖缓冲区里的残留字符就行。

2. 换用cin.getline()更省心

cin.getline()和cin.get()功能差不多,但它会自动把读取到的换行符从缓冲区里扔掉,不需要你手动清理,用起来更顺手:

#define MAX 100
#include <iostream>

int main(){ 
    char str1[MAX], str2[MAX]; 
    std::cout <<" 1st string: "; 
    std::cin.getline(str1, MAX); 
    std::cout <<" 2nd string: "; 
    std::cin.getline(str2, MAX); 
    std::cout << str1 << "\n" << str2; 
    return 0; 
}

3. 直接用std::string(强烈推荐)

如果你不是必须要用字符数组的话,用C++的std::string配合std::getline()是最方便的,完全不用操心缓冲区大小和换行符的问题:

#include <iostream>
#include <string>

int main(){ 
    std::string str1, str2; 
    std::cout <<" 1st string: "; 
    std::getline(std::cin, str1); 
    std::cout <<" 2nd string: "; 
    std::getline(std::cin, str2); 
    std::cout << str1 << "\n" << str2; 
    return 0; 
}

这个方法会读取整行输入(包括空格),直到你按下回车,而且自动处理换行符,绝对不会出现提前终止的问题。


内容的提问来源于stack exchange,提问作者Shlok Srivastava

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:57:12