将char指针传递给cin和cin.get()

Passing char pointer to cin and cin.get()

本文关键字:cin get char 指针      更新时间:2023-10-16

在做一些简单的练习时,我现在对iostream和指针有很大的疑问。

这是我制作的两个略有不同的文件(它们都能工作):

文件1接收到"我的名字是#Marco"的输入,并打印出"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 readn";
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 readn";
return 0;
}

我不明白的是,为什么在第二个文件的第8行,我必须写"cout<<*ch",而不是像第一个文件那样写"cout<<ch"。事实上,如果我在文件2中使用"cout<<ch",我得到的只是一堆随机符号(我想字符取自指针的地址)

在第一种情况下,您正在将C样式字符串读取到数组中。这意味着cin一次读取一个字符串,并将该字符序列存储在ch中,然后是终止的空字符。运行cout << ch时,cout将尝试打印整个字符串,当它碰到空字符时停止。

在第二种情况下,您正在读取单个字符并将其存储在ch[0]中。当您运行cout << ch时,cout会认为您的char*是一个C风格的字符串,并且它会尝试打印整个字符串,只有当它碰到一个null字符时才会停止。第一个字符之后的字符可能是垃圾值——不管内存中发生了什么。这是未定义的行为。

请注意,在实际代码中,您应该检查您的读取是否成功。如果您的程序遇到EOF或无效输入,您的循环将永远运行。此外,如果用户输入的字符太多,cin >> ch可能会导致缓冲区溢出。最好使用std::string或采用流大小参数的cin.get版本。