将 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 << ch
、cout
认为您的 char*
是一个 C-style 字符串时,它会尝试打印整个字符串,仅在遇到空值时停止特点。第一个之后的字符可能是垃圾值——内存中的任何内容。这是未定义的行为。
请注意,在实际代码中,您应该检查读取是否成功。如果您的程序遇到 EOF 或无效输入,您的循环将永远 运行。如果用户输入太多字符,cin >> ch
也有可能超过 运行 的缓冲区。最好使用 std::string
或带有流大小参数的 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 << ch
、cout
认为您的 char*
是一个 C-style 字符串时,它会尝试打印整个字符串,仅在遇到空值时停止特点。第一个之后的字符可能是垃圾值——内存中的任何内容。这是未定义的行为。
请注意,在实际代码中,您应该检查读取是否成功。如果您的程序遇到 EOF 或无效输入,您的循环将永远 运行。如果用户输入太多字符,cin >> ch
也有可能超过 运行 的缓冲区。最好使用 std::string
或带有流大小参数的 cin.get
版本。