2012-02-14 14 views
0

この関数は少し実行され、proc_index変数は-1886854513になります。コードに何か問題がありますか?なぜこのintはランダムに巨大な負の値に変わるのですか?

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; 
} 
+0

'num_of_sub_lists 'の最大値はいくらですか? 'num_of_sub_lists'は負になりますか? – Xeo

+1

MAX_WORD_LENが実際に最大値になっていますか?そうでなければ、スタックの次のものを上書きすることができます。これはprocIndexです。 – user1118321

+0

@ user1118321:しかし、入力ストリームがunsanitizedであることに関して、 'MAX_WORD_LEN'は決して十分ではありません。プログラムを制動するには 'program

答えて

2

それはあなたがそれのために割り当てられてきたよりも、最も可能性が高いあなたはwordに多くのバイトを読むことによって引き起こされ、ほぼ確実に破損が原因です。 、変化を検出する

簡単な方法:

cerr << "point2\n"; 

へ:

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

さておき、あなたがデータ上無制限*scanf("%s")をやってみたいことはありませんとして、あなたはない完全を行いますコントロール。あなたは文字データの後ろにいるので、バインド( "%20s"のような)を使うか、fgetscan prevent buffer overflowsを使用するのが良いでしょう。

あるいは、それよりもさらに良いは、この行は怪しいです

+2

さらに簡単に修正する: 'word'を' std :: string'に変更し、 'std :: getline 'fscanf'の代わりに' – Xeo

+0

私はこの4時間前に尋ねたと思います... – Marty

+0

'std :: getline'を"空白以外の文字列 "にマッチさせることはできません。私は 'istream :: operator >>'が目的に合っていると思います。 –

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

:-) C++ getlineと文字列ではなく、いくつかの奇妙なC/C++のハイブリッドを使用しています。十分なスペースがあるかどうかは、fscanfに記載されている前提条件を作成してください。word*パフォーマンスが問題であるならば、あなたはCストリームとの同期を無効にすることができます(ただし、その間のすべてのCスタイルIOを取り除くために持っている)

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

:あなたはそれを簡単に修正することができます

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

*:実際には、非圧縮ストリーム(stdin)から読み込んでいるため、意識的にプログラムを制動し、システム全体にセキュリティ違反を起こす可能性があります。

関連する問題