C++ 从控制台读取字符串的不同方法实际上有何不同?操作员<&书信电报;,getline还是cin.getline?

C++ 从控制台读取字符串的不同方法实际上有何不同?操作员<&书信电报;,getline还是cin.getline?,c++,input,C++,Input,假设我想从控制台读取一个整数,如果输入非整数字符,我不希望程序中断。我会这样做: #include <iostream> #include <sstream> #include <string> using namespace std; int main() { string input; int n; cin >> input; if(!(stringstream(input)>>n)) cout <&

假设我想从控制台读取一个整数,如果输入非整数字符,我不希望程序中断。我会这样做:

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main() {
    string input; int n;
    cin >> input;
    if(!(stringstream(input)>>n)) cout << "Bad input!\n";
    else cout << n;
    return 0;
}
#包括
#包括
#包括
使用名称空间std;
int main(){
字符串输入;int n;
cin>>输入;
如果(!(stringstream(input)>>n))无法输入
。这两种方法之间是否存在相关差异

另外,我想知道,既然
string
不应该有任何长度限制……如果有人将10GB长的字符串传递给这个程序,会发生什么情况?将输入存储在有限长度的字符表中,并使用例如
cin.getline(input,256)

获取一行(包括空格)并进行读取不是更安全吗(但丢弃)结尾的换行符。读取以空格分隔的“word”

例如,如果您的输入是

123 456 789 123 456 789 使用
std::getline
将为您提供字符串
“123 456 789”
,但使用输入运算符
>
将只获得
“123”


理论上没有限制,但事实上,它当然只限于它可以分配的内存量。

第一个得到一行, 第二个得到一个世界。如果您输入“hello world”


  • getline(cin,str):str==“你好,世界”
  • cin>>str:str=“你好”

  • 而且不要担心超出范围,比如
    向量
    字符串
    可以增长

    • 运算符>>读取一个单词(即最多下一个空格字符)
    • std::getline()读取一个“行”(默认情况下,直到下一个换行符,但您可以配置分隔符),并将结果存储在std::字符串中
    • istream::getline()以类似于std::getline()的方式读取一条“线”,但它的目标是一个字符数组。(这是一个可以作为cin.getline()找到的数组)
    如果将一条10GB的线路传递给程序,那么在32位系统上可能会耗尽内存,或者需要一段时间来解析它,从而可能会将相当多的内存交换到64位系统上的磁盘上


    任意的行长度大小限制是否有意义,实际上可以归结为您的程序希望处理哪种类型的数据,以及在获取太多数据时希望产生哪种类型的错误。(简单地忽略其余数据可能是不可接受的行为,因此您可能希望读取并对其执行部分操作,或者出错)

    这可能有助于澄清如何做到最好:限制是实现定义的
    std::string::max\u size
    。如果超过此限制,则设置
    std::ios\u base::failbit