2017-02-05 60 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版本。