簡體   English   中英

cin / cout與char []

[英]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]="";

即,它將fc聲明為一個字符的數組(即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.

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