为什么char数组周围的堆栈已损坏

时间:2014-10-16 00:27:52

标签: c++ arrays char stack

我是来自Java的C ++新手。我正在努力从Char数组中提取第一个单词,所以我认为创建一个新数组来保存所有第一个单词字符并将它们传送到句子中的循环进入句子中的空间就可以了。这是代码:

void execute(){
//start with getting the first word
char first_word[20];
int i = 0;
while (input[i] != ' '){ // input is a char array declared and modified with cin, obtaining the command.
    first_word[i] = input[i];
    i++;
}
print(first_word + ' ' + 'h' + ' ' + 'h' + 'a');
}

尝试执行此操作时,我收到错误"堆叠变量' first_word'被腐蚀了#34;为什么会这样?

1 个答案:

答案 0 :(得分:2)

cin >> input是一个字符数组时,

input没有做你认为它做的事情。 >>运算符无法读入字符数组,您必须使用cin.getline()cin.read()。因此,您实际上是通过处理无效内存而导致未定义的行为。

即使它确实有效,你也没有进行任何边界检查。如果input在遇到空格字符之前有超过20个字符(或者更糟糕的是,根本不包含空格字符),则会在first_word的末尾写入周围的内存。

如果你真的想用C ++编写代码,不要在字符串中使用字符数组。这就是C处理字符串的方式。相反,C ++使用std::string,其中包括find()substr()方法。并且std::cin知道如何使用std::string

例如:

#include <string>

void execute()
{
    //start with getting the first word
    std::string first_word;
    std::string::size_type i = input.find(' '); // input is a std::string read with cin, obtaining the command.
    if (i != std::string::npos)
        first_word = input.substr(0, i);
    else
        first_word = input;
    std::cout << first_word << " h ha";
}