gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 02:12:54 28 4
gpt4 key购买 nike

做了一些简单的练习,我现在对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 行的第二个文件中我必须写“cout << *ch”而不是第一个文件中的“cout << ch”。事实上,如果我在文件 2 中使用“cout << ch”,我得到的只是一堆随机符号(我猜是从指针地址中提取的字符)

最佳答案

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

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

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

关于c++ - 将 char 指针传递给 cin 和 cin.get(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42054554/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com