我有这两个代码:
char a[256];
cin>>a;
cout<<a;
和
char a[256];
cin.get(a,256);cin.get();
cout<<a;
也许,相对于第二个没有cin.get();
char a[256];
cin.get(a,256);
cout<<a;
我的问题是(第一个):对于char数组,我应该使用什么? cin还是cin.get()?为什么我要使用cin.get();我的char初始化后没有参数?
我的第二个问题是:我的c ++老师教我每次使用cin.get()初始化字符和每个初始化char数组或int数组或者只是int或者其他什么时候再次使用cin.get();在它之后。这是我最初想问的问题。
所以,现在我得到了这两个: 在这种情况下,在整数初始化之后没有cin.get(),我的程序将会中断,我不能再进行char初始化了。
int n;
cin>>n;
char a[256];
cin.get(a,256); cin.get(); // with or without cin.get();?
cout<<a;
正确的一个:
int n;
cin>>n; cin.get();
char a[256];
cin.get(a,256); cin.get(); // again, with or without?
cout<<a;
那么,问题是什么?请有人为每个案例解释一下!谢谢。
答案 0 :(得分:9)
他们做不同的事情,所以选择你想要的东西,或者下面给出的更好的选择。
第一个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
字符串将增长以适应任何数量的输入。
答案 1 :(得分:3)
问题很可能在于您稍后输入值的方式。每次初始化后cin.get()
都会“抓取”每次按Enter键时放入流中的换行符。
假设您开始输入这样的值:
2
a b c d...
假设你在2之后按了Enter键,换行符也被放在了流上。在此之后调用cin.get()
时,它将获取并丢弃换行符,允许其余代码正确获取输入。
要回答您的第一个问题,对于数组,您应该使用cin.get
而不是重载的运算符>> cin>>
,因为它只会抓取一个单词,并且不会限制抓取的字符数量,这可能导致溢出和数据损坏/程序崩溃。
另一方面,cin.get()
允许您指定读取的最大字符数,以防止此类错误。
答案 2 :(得分:2)
对于char数组,使用cin.get()因为它计算空格而cin不计算,更重要的是设置要读取的最大数字字符。
char foo[25]; //set maximum number of characters
cout << "Please type in characters for foo << endl;
cin.get(foo,25);
cout << ' ' << foo;
在这种情况下,您只能输入24个字符和空终结符字符&#39; / 0&#39;。 我希望这能回答你的第一个问题。 我个人会用字符串。