我正在努力建立我在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;
虽然未明确重新分配值,但却以这种方式变化?
答案 0 :(得分:9)
char f[]="", c[]="";
相当于
char f[1]="", c[1]="";
即。它将f
和c
声明为一个字符的数组(即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