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

时间:2017-02-05 16:37:12

标签: c++ pointers cin cout

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

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

文件1接收输入为"我的名字是#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行的第二个文件中我必须写&#34; cout&lt;&lt; * CH&#34;而不是&#34; cout&lt;&lt; CH&#34;和第一个一样。 事实上,如果我使用&#34; cout&lt;&lt; CH&#34;在文件2中,我得到的是一堆随机符号(我猜的是从指针的地址中取出的字符)

1 个答案:

答案 0 :(得分:2)

在第一种情况下,您正在向阵列中读取C风格的字符串。这意味着cin一次读取一串字符,并将该字符序列存储在ch后跟一个终止空字符\0。当您运行cout << ch时,cout将尝试打印整个字符串,当它到达空字符时停止。

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

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