1

我正在尝试从 VBA 中建立我在 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(输出)

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

我也尝试使用此代码打印结果,但发生了同样的问题,所以我在这里假设这是cinand not的问题cout

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

做了一些研究,我发现了这个问题,看起来很有希望,但是当我将声明从 更改char f[]为 时char *f,我最终在 上出现了 SEGFAULT cin,而const char *f甚至无法编译。

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

重申我的问题:为什么 outputstd::cout << f << std::endl;虽然没有明确地重新分配值,但会以这种方式变化?

4

3 回答 3

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

相当于

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

即,它将f和声明c为一个字符的数组(即NULor \0,空终止符)。

换句话说,您正在读取两个数组的末尾,这可以完美地工作,可以做非常奇怪的事情(就像您所看到的那样),可能会崩溃,或者可能让紫色大象在下周二从您的显示器中喷出。

于 2012-07-08T06:06:48.640 回答
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数组,但您不必那样使用它。

于 2012-07-08T06:15:21.473 回答
0
#include < iostream >

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

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

于 2014-11-30T18:56:39.437 回答