繁体   English   中英

我无法理解C ++中的char []行为

[英]I can't understand char[] behavior in C++

向堆栈溢出社区致意。 我试图从最基础的方面学习C ++,并且遇到了一些奇怪的(至少对我来说)行为。 这是我的“你好世界”

#include <iostream>

int main() 
{
    std::cout << "Enter Thing! " << std::endl;
    char Thing[]="";
    std::cin >> Thing;
    std::cout << "Thing is " << Thing << "!" << std::endl;
    int i=0;
    while (i <= 10)
    {
        ++i;
         std::cout << "Thing is " << Thing << " in " << i << " while!" << std::endl; 
         std::cout << "i is " << i << "!" << std::endl;
    }
    std::cout << "Thing is " << Thing << " after while!" << std::endl;
    std::cout << "i is " << i << ".5!" << std::endl;
}

真正困扰我的是它提供的输出。

Enter Thing!
thing
Thing is thing!
Thing is t☺ in 1 while!
i is 1!
Thing is t☻ in 2 while!
i is 2!
Thing is t♥ in 3 while!
i is 3!
Thing is t♦ in 4 while!
i is 4!
Thing is t♣ in 5 while!
i is 5!
Thing is t♠ in 6 while!
i is 6!
Thing is t in 7 while!
i is 7!
Thing is  in 8 while!
i is 8!
Thing is t       in 9 while!
i is 9!
Thing is t
 in 10 while!
i is 10!
Thing is t♂ in 11 while!
i is 11!
Thing is t♂ after while!
i is 11.5!

我真的不明白那里发生了什么。 甚至更多,例如,如果我添加“用于”构造

for (int i=4; i <=7; ++i)
    {
        std::cout << "i is " << i << "!" << std::endl;
        std::cout << "Thing is " << Thing << " for!" << std::endl;
    }
    std::cout << "i is " << i+3 << ".5!" << std::endl;    
    std::cout << "Thing is " << Thing << " after for!" << std::endl;

输出更改为更奇怪的事情

Enter Thing!
thing
Thing is thing!
Thing is thing☺ in 1 while!
i is 1!
Thing is thing☻ in 2 while!
i is 2!
Thing is thing♥ in 3 while!
i is 3!
Thing is thing♦ in 4 while!
i is 4!
Thing is thing♣ in 5 while!
i is 5!
Thing is thing♠ in 6 while!
i is 6!
Thing is thing in 7 while!
i is 7!
Thing is thin in 8 while!
i is 8!
Thing is thing   in 9 while!
i is 9!
Thing is thing
 in 10 while!
i is 10!
Thing is thing♂ in 11 while!
i is 11!
Thing is thing♂ after while!
i is 11.5!
i is 4!
Thing is t♦ for!
i is 5!
Thing is t♣ for!
i is 6!
Thing is t♠ for!
i is 7!
Thing is t for!
i is 14.5!
Thing is  after for!

可能是我愚蠢或某事,但是如果我什至不能使最基本的事情都起作用,我就无法继续学习。 抱歉,如果某个问题已经解决,请尽我最大的努力寻找答案,但没有成功。 所以,你会高兴地指出我在哪里吗? 谢谢。

PS我在Win7x64m下使用NetBeans 8和Cygwin。

Thing变量是仅包含一个字符的数组。 向其写入多个字符将超出范围并导致不确定的行为

空字符串文字""是一个包含单个字符的数组,即字符串终止符,编译器将使用该数组将Thing数组初始化为精确的副本。

基本上,您有两种解决方案,要么声明数组的大小较大:

char Thing[128] = "";

或者您使用标准的C ++字符串类

std::string Thing;

我绝对推荐后一种解决方案。

这是有问题的:

 char Thing[]="";

您正在创建一个包含单个字符的空数组,并将用户输入写入其中。

第一次您偶然有正确的输出,但是随后数据被覆盖,您得到了这个奇怪的输出。

创建具有足够缓冲区长度的字符串

char thing[256];  

或使用字符串对象。

正如其他答案所建议的那样,您无需真正初始化就可以使用char数组(提供固定大小)。 此外,这是C风格的编程。 我强烈建议使用C ++的std::string而不是char -Array,因为这不会那么容易出错。

由于代码已编译,因此在本地声明的此类数组的大小应固定。

char Thing[] = "";

这给您一种幻想,“事物”的大小是可变的。 遗憾的是,“物”的大小将根据右边给出的初始值自动推导出,这使您输入的字符串写在内存中的意外位置,从而导致不确定的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM