0

行から単語を解析し、英数字以外の文字にヒットしたときに単語をツリーに追加するプログラムを作成中です。行にスペースがなければ、すべてうまくいきます。ただし、英数字以外の文字がある場合、問題のループ (コード内のコメント行から始まる) のサイズは半分になります!

ループが半分になるのはなぜですか?

Tree addin (char* filee, Tree tree)
{
    int i;
    FILE *fp;
    fp = fopen(filee, "r");
    char* hold2 = malloc(99);
    int count=-1;
    char* hold;
    while ((hold=getLine(fp))!=NULL)
    {
        count=-1;
        for (i=0; i<strlen(hold); i++) //The loop in question
        {
            count++;
            if ((isalnum(hold[count])==0)&&(hold[count]!='\n'))
            {
                strncpy(hold2, hold, count);
                hold2[count]='\0';
                hold=strdup(&hold[count+1]);
                count=-1;
                tree = insertT(tree, hold2);
            }
        }
        tree = insertT(tree, hold);
    }
    free(hold);
    fclose(fp);
    return tree;
}
4

2 に答える 2

5

英数字以外の文字が見つかると、プログラムはhold文字列の残りの部分を指すように移動しますが、リセットはしませんi。つまりhold、元のポインターの途中にある新しいポインターと、iその時点で起こったことから反復を続けることを意味します。そうすることで、おそらく少なくとも一連の文字がスキップされ、文字列の外側のメモリで操作を開始する可能性があります。これは間違いなく悪いニュースです。

于 2013-05-06T04:24:02.950 に答える
0

は反復ごとに再評価されるためhold、ループ内での値を変更したことが原因である可能性があります。解決策は、ループに入る前にstrlen(hold)の値を保存することです。strlen(hold)for

于 2013-05-06T04:25:43.567 に答える