这就是我要做的......
char input[4];
cin >> input;
cout << "Input[0]: " << input[0] << "Input[1]: " << input[1] << "Input[2]: " << input[2] << "Input[3] " << input[3]<< "Input[4] " << input[4] <<endl;
然而,当我输入“PF”时,我得到一个输出:输入[0]:P输入[1]:输入[2] :(一个奇怪的看起来正方形,顶部有两个零,零和4开底部)输入[3]输入[4]
为什么我会得到那个奇怪的角色而不是F?
答案 0 :(得分:3)
cin >>
按空格分隔输入,因此当您输入P<space>F
时,只有P
被input
接受,F
排队等候下一个cin >>
。
因此在cin >> input
行之后,您的input
将会是
input[0] = 'P';
input[1] = '\0';
// input[2] = garbage;
// input[3] = garbage;
// input[4] = buffer-overflow;
也许您想使用cin.getline
:
cin.getline(input, 4);
cout << ...;
(或者更好的是,使用具有灵活字符串长度的std::string
。)
答案 1 :(得分:2)
从cin
中提取会在空格上中断,因此它只会读取P
。如果您想阅读用户的一行,您应该查看getline()
std::string input;
std::getline(std::cin, input);
答案 2 :(得分:0)
你在做什么实际上非常危险。您的input
变量实际上正在降级为char*
类型的对象,因此它实际上是在尝试将字符串读入您的input
变量;但是,由于它不知道您的input
数组可以容纳多少个字符,因此可能会超出input
。因此,您拥有的代码实际上是buffer overflow vulnerability。相反,你应该使用:
for (int i = 0; i < 4; i++ ){ std::cin >> input[i]; }
至于为何你得到那个奇怪的角色......流提取算子&gt;&gt;读取由空格分隔的单词,因此“P F”实际上只读取“P”。所以,你的输入变量被填充“P”(这是NUL终止的,所以你实际上有'P'然后是'\ 0')。剩下的元素是未初始化的,因此有任何垃圾发生在那里。另外,我应该补充一点,如果你确实想要读取字符串,那么std::getline是从输入中读取std :: string对象的一种非常好的方法,如下所示:
std::string result; std::getline(std::cin,result);