使用char []的cin / cout

时间:2012-07-08 06:00:20

标签: c++ char cin

我正在努力建立我在V ++中使用C ++的整体专业知识,所以请原谅我的代码中的任何明显问题......使用下面这个简单的程序,我会得到意想不到的输出。

#include <iostream>

int main() {
char f[]="", c[]="";
std::cin >> f;
std::cout << f << std::endl;
std::cin >> c;
std::cout << f << std::endl;
return 0;
}

运行时,这是我的结果:

  

ABC(输入)
  f - ABC(输出)
  DEF(输入)
  f - EF(输出)

也试过:

  

ABC DEF(输入)
  f - ABC(输出)
  f - EF(输出)

我希望两行的输出相同,因为我 THINK 我只读了f一次。此外,如果我正在使用cin并将其应用于f,为什么第一次尝试会读取整个字符串(ABC),而第二次尝试却缺少D

我尝试使用此代码打印结果,但同样的问题出现了,所以我假设这是cin而不是cout的问题。

for (j=0;j<3;j++) {
    std::cout << f[j];
}
std::cout << std::endl;

做了一些研究,我发现this question看起来很有希望,但当我将声明从char f[]更改为char *f时,我最终在cin上找到了SEGFAULT ,而const char *f甚至不会编译。

我在这里盲目地摸索,并希望获得有关如何正确使用cin和/或char数组的一些指导。

重申我的问题:为什么输出std::cout << f << std::endl;虽然未明确重新分配值,但却以这种方式变化?

3 个答案:

答案 0 :(得分:9)

char f[]="", c[]="";

相当于

char f[1]="", c[1]="";

即。它将fc声明为一个字符的数组(即NUL\0,空终止符。)

换句话说,你正在阅读两个阵列的结尾,它们可以完美地工作,可以做很奇怪的事情(就像你看到的那样),可能会崩溃,或者可能会让紫色的大象在下周二从你的显示器中爆发出来

答案 1 :(得分:0)

看起来您应该使用getline功能。它有两个版本......

一个在C ++标准库中,并以这种方式使用:

std::string s;
// the following returns the stream that you give
// (the cast is non-functional, it's there to show the type)
(istream&)getline(cin, s);

string对象很好用,因为它动态调整自身大小以容纳你收到的任何东西。

其他getline位于标准C库中,至少在Mac OS X上(运行man 3 getline以获取更多信息),它使用FILE*代替流。该版本能够动态地重新分配char数组(如果您需要),但您不必以这种方式使用它。

答案 2 :(得分:0)

#include < iostream >

int main() {
    char f[]="";
    char c[]="";

试试这些,它为我解决了问题; D