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

Passing char pointer to cin and cin.get()

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

这是我制作的 2 个略有不同的文件(它们都有效):

文件 1 接收输入 "My name is # Marco" 并且 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",我得到的只是一堆随机符号(我猜是从指针地址中提取的字符)

在第一种情况下,您正在将 C-style 字符串读入数组。这意味着 cin 一次读取一个字符串,并将该字符序列存储在 ch 中,后跟一个终止空字符 [=12=]。当您 运行 cout << ch 时,cout 将尝试打印整个字符串,并在遇到空字符时停止。

在第二种情况下,您正在读取 单个字符 并将其存储在 ch[0] 中。当您 运行 cout << chcout 认为您的 char* 是一个 C-style 字符串时,它会尝试打印整个字符串,仅在遇到空值时停止特点。第一个之后的字符可能是垃圾值——内存中的任何内容。这是未定义的行为。

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