C++ 字符数组的cin和cin.get()之间的差异

C++ 字符数组的cin和cin.get()之间的差异,c++,arrays,string,namespaces,cin,C++,Arrays,String,Namespaces,Cin,我有以下两个代码: char a[256]; cin>>a; cout<<a; chara[256]; cin>>a; 他们做不同的事情,所以选择你想要的,或者下面给出的更好的选择 第一个cin>>a读取单个单词,跳过任何前导空格字符,并在遇到空格字符(包括行尾)时停止 第二个cin.get(a,256);cin.get()读取整行,然后使用行尾字符,这样重复此操作将读取下一行cin.getline(a,256)是一种稍微简洁的方法 第三个cin.get(a,256)读

我有以下两个代码:

char a[256];
cin>>a;
cout<<a;
chara[256];
cin>>a;

他们做不同的事情,所以选择你想要的,或者下面给出的更好的选择

第一个
cin>>a
读取单个单词,跳过任何前导空格字符,并在遇到空格字符(包括行尾)时停止

第二个
cin.get(a,256);cin.get()读取整行,然后使用行尾字符,这样重复此操作将读取下一行<代码>cin.getline(a,256)
是一种稍微简洁的方法

第三个
cin.get(a,256)
读取整行,但在流中保留行尾字符,因此重复此操作将不会提供更多输入

在每种情况下,如果输入字/行比固定大小的缓冲区长,就会出现某种不良行为。因此,通常应使用更友好的字符串类型:

std::string a;
std::cin >> a;              // single word
std::getline(std::cin, a);  // whole line

字符串将增长以适应任意数量的输入。

问题很可能是您以后输入值的方式。每次初始化后,
cin.get()
会在每次按enter键时“抓取”放入流中的换行符。 假设您开始像这样输入您的值:

2 

a b c d...
假设在2之后按enter键,换行符也会放在流中。之后调用
cin.get()
时,它将抓取并丢弃换行符,从而允许代码的其余部分正确地获取输入

要回答第一个问题,对于数组,应该使用
cin.get
而不是重载运算符
>cin>
,因为这样只会捕获一个单词,并且不会限制捕获的字符数,这可能会导致溢出和数据损坏/程序崩溃


另一方面,
cin.get()
允许您指定读取的最大字符数,以防止此类错误。

对于字符数组,使用cin.get(),因为它计算空白,而cin不计算空白。更重要的是,cin.get()设置要读取的最大字符数。例如:

 char foo[25]; //set maximum number of characters 
 cout << "Please type in characters for foo << endl;
 cin.get(foo,25);
 cout << ' ' << foo;
charfoo[25]//设置最大字符数
库特
int n;
cin>>n; cin.get();
char a[256];
cin.get(a,256); cin.get(); // again, with or without?
cout<<a;
std::string a;
std::cin >> a;              // single word
std::getline(std::cin, a);  // whole line
2 

a b c d...
 char foo[25]; //set maximum number of characters 
 cout << "Please type in characters for foo << endl;
 cin.get(foo,25);
 cout << ' ' << foo;