关于char输入的问题

时间:2010-04-26 07:42:09

标签: c++

这就是我要做的......

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?

3 个答案:

答案 0 :(得分:3)

cin >>按空格分隔输入,因此当您输入P<space>F时,只有Pinput接受,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);