做一些简单的练习,我现在对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中,我得到的是一堆随机符号(我猜的是从指针的地址中取出的字符)
答案 0 :(得分:2)
在第一种情况下,您正在向阵列中读取C风格的字符串。这意味着cin
一次读取一串字符,并将该字符序列存储在ch
后跟一个终止空字符\0
。当您运行cout << ch
时,cout
将尝试打印整个字符串,当它到达空字符时停止。
在第二种情况下,您正在阅读单个字符并将其存储在ch[0]
中。当您运行cout << ch
时,cout
认为您的char*
是一个C风格的字符串,它会尝试打印整个字符串,只有在遇到空字符时才会停止。第一个之后的字符可能是垃圾值 - 无论发生在内存中。这是未定义的行为。
请注意,在实际代码中,您应该检查您的读取是否成功。如果您的程序遇到EOF或无效输入,您的循环将永远运行。如果用户输入太多字符,cin >> ch
也有可能导致缓冲区溢出。最好使用std::string
或采用流大小参数的cin.get
版本。