[英]cin/cout with char[]
我正在嘗試從VBA建立C ++方面的整體專業知識,因此請原諒我的代碼中任何明顯的問題...使用下面的這個簡單程序,我得到了意外的輸出。
#include <iostream>
int main() {
char f[]="", c[]="";
std::cin >> f;
std::cout << f << std::endl;
std::cin >> c;
std::cout << f << std::endl;
return 0;
}
運行時,這是我的結果:
ABC(輸入)
f-ABC(輸出)
DEF(輸入)
f-EF(輸出)
也嘗試過:
ABC DEF(輸入)
f-ABC(輸出)
f-EF(輸出)
我希望這兩行的輸出是相同的,因為我認為我只讀了一次f
。 此外,如果我服用cin
並將其應用於f
,為什么第一次嘗試讀取整個字符串( ABC
),而第二次嘗試卻缺少D
?
我也嘗試使用此代碼打印結果,但是發生了同樣的問題,因此我假設這是cin
而不是cout
。
for (j=0;j<3;j++) {
std::cout << f[j];
}
std::cout << std::endl;
經過研究,我發現這個問題看起來很有希望,但是當我將聲明從char f[]
更改為char *f
,我在cin
上使用SEGFAULTs結束了,而const char *f
甚至無法編譯。
我在這里盲目摸索,並希望獲得有關如何正確使用cin
和/或char
數組的一些指導。
重申我的問題: 為什么輸出std::cout << f << std::endl;
,雖然沒有明確地重新分配值,卻以這種方式變化?
char f[]="", c[]="";
相當於
char f[1]="", c[1]="";
即,它將f
和c
聲明為一個字符的數組(即NUL
或\\0
,即空終止符)。
換句話說,您正在讀入兩個數組的末尾,它們可以完美工作,做一些非常奇怪的事情(如您所看到的),崩潰,或者使下周二的紫色大象從顯示器上噴出來。
看來您應該使用getline
函數。 它有兩個版本...
一個在C ++標准庫中,並以這種方式使用:
std::string s;
// the following returns the stream that you give
// (the cast is non-functional, it's there to show the type)
(istream&)getline(cin, s);
string
對象對此非常有用,因為它可以動態調整自身大小以容納您收到的任何內容。
另一個getline
在標准C庫中,至少在Mac OS X上(運行man 3 getline
)在標准C庫中,並且它使用FILE*
代替流。 如果需要,該版本可以動態重新分配char
數組,但您不必那樣使用它。
#include < iostream >
int main() {
char f[]="";
char c[]="";
試試這些,它為我解決了問題; D
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.