簡體   English   中英

char數組的cin和cin.get()的區別

[英]Difference between cin and cin.get() for char array

我有這兩個代碼:

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;

我的問題是(第一個):對於字符數組,我應該使用什么? cin 還是 cin.get()? 為什么我應該使用 cin.get(); 我的字符初始化后沒有參數?

我的第二個問題是:我的 c++ 老師教我每次使用 cin.get() 初始化字符,在每次初始化字符數組或 int 數組或只是 int 或其他之后,再次放置 cin.get(); 之后。 這就是我最初想問的。

所以,現在我得到了這些 2:在這種情況下,在整數初始化之后沒有 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;

那么,怎么了? 請有人為每個案例解釋! 謝謝你。

他們做不同的事情,所以選擇你想要的任何一個,或者下面給出的更好的選擇。

第一個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()允許您指定讀取的最大字符數,從而防止此類錯誤。

對於 char 數組,請使用 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;

在這種情況下,您只能輸入 24 個字符和一個空終止符 '\\0'。
我希望這能回答你的第一個問題。 我個人會使用字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM