为什么这个int随机变成一个巨大的负值?

时间:2012-02-14 05:12:39

标签: c++

此函数运行一段时间,然后proc_index变量转到-1886854513。代码有问题吗?

int parse_words(vector< vector<string> > &temp_word_vec, int num_of_sub_lists)
{
    char word[MAX_WORD_LENGTH+1]; // +1 makes room for a newline character
    int proc_index = 0; //index of word arr for child process "proc_index"
    string word_str;

    cerr << "point1\n";
    while(fscanf (stdin, "%s", &word) != EOF)
    {
        cerr << "point2\n";
        for(int i = 0; i < MAX_WORD_LENGTH; i++)
        {
            word[i] = tolower(word[i]);
            if(word[i] == '\0')
            {
                word_str.push_back('\n');
                word_str.push_back('\0');
                break;
            }
            if(isalpha(word[i]))
            {
               word_str.push_back(word[i]);
            }
        }
        cerr << "point3, proc_index = " << proc_index << ", word is " << word_str << "\n";

        temp_word_vec[proc_index].push_back(word_str);

        ++proc_index;

        if(proc_index == num_of_sub_lists)
            proc_index = 0;
        word_str.clear();
    }

    return 0;
}

2 个答案:

答案 0 :(得分:2)

这几乎可以肯定是由于腐败造成的,很可能是因为你在word中读取的字节多于你为其分配的字节数。

检测,更改的简便方法:

cerr << "point2\n";

为:

cerr << "point2 maxword = " << MAX_WORD_LENGTH <<
    ", strlen = " << strlen (word) << '\n';

顺便说一下,从不想要对完全控制的数据进行无限制的*scanf("%s")。使用绑定(例如“%20s”),或者更好,因为您只是在字符数据之后,使用fgets getline。{/ p>

或者,甚至更好,使用带有{{1}}的C ++字符串,而不是一些奇怪的C / C ++混合: - )

答案 1 :(得分:2)

while(fscanf (stdin, "%s", &word) != EOF)

这条线很可疑。形成你所描述的先决条件,你和fscanf都不知道word * 中是否有足够的空间。您可以通过简单的方式解决问题:

std::string word;
while (stdin >> word)

如果性能有问题,您可以停用与C流的同步(但您必须摆脱其间的所有C样式IO):

const bool sync_prev = ios_base::sync_with_stdio (false);
...
ios_base::sync_with_stdio (sync_prev);

* :实际上,因为您正在读取未经过清理的流(stdin),所以每个用户都可以有意或无意地制止您的程序并可能在整个系统中发生安全漏洞。