2017-02-05 62 views
1

做一些簡單的練習,我現在對iostream和指針有一個很大的懷疑。傳遞char指針到cin和cin.get()

這是2頁稍有不同的文件,我做(他們都工作):

文件1接收輸入爲「我的名字是#馬」和cout打印「Mynameis」

int main(){ 
using namespace std; 
char* ch=new char[256]; 
int count=0; 
cout <<"Enter chars, # to quit:\n"; 
cin >> ch; 
while(*ch!='#'){ 
    cout << ch; 
    ++count; 
    cin >> ch; 
} 
cout << endl << count << " characters read\n"; 
return 0; 
} 

文件2作爲前接收相同的輸入,但此時COUT打印的空間太:

int main(){ 
using namespace std; 
char* ch=new char[256]; 
int count=0; 
cout <<"Enter chars, # to quit:\n"; 
cin.get(*ch); 
while(*ch!='#'){ 
    cout << *ch; 
    ++count; 
    cin.get(*ch); 
} 
cout << endl << count << " characters read\n"; 
return 0; 
} 

我不明白的是,爲什麼在第8行的第二個文件我必須寫「COUT < < * ch「而不是」cout < < ch「,如第一個那樣。其實,如果我在文件2中使用「cout < < ch」,我得到的只是一堆隨機符號(我猜是從指針地址中提取的字符)

回答

1

在第一種情況下,您正在閱讀C-樣式字符串到你的數組中。這意味着cin正在一次讀取一串字符,並將該字符序列存儲在ch之後,後面跟着一個終止空字符\0。當您運行cout << ch時,cout將嘗試打印整個字符串,並在它遇到空字符時停止。

在第二種情況下,您正在閱讀單個字符並將其存儲在ch[0]中。當您運行cout << ch時,cout認爲您的char*是C風格的字符串,它會嘗試打印整個字符串,僅當它遇到空字符時停止。第一個字符後面的字符可能是垃圾值 - 不管發生在內存中。這是未定義的行爲。

請注意,在實際代碼中,您應該檢查您的讀取是否成功。如果你的程序遇到EOF或無效輸入,你的循環將永遠運行。如果用戶輸入太多字符,cin >> ch也有可能導致緩衝區溢出。最好使用std::string或採用流大小參數的cin.get版本。