每当遇到空格时,C - Loop似乎减半

时间:2013-05-06 04:15:03

标签: c loops

我正在制作一个程序来解析一行中的单词,当一个单词遇到一个非字母数字字符时,它会向树中添加一个单词。一行中没有空格,一切都很顺利。但是,当存在非字母数字字符时,有问题的循环(从代码中注释的行开始)的大小减半!

为什么循环减半?

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

2 个答案:

答案 0 :(得分:5)

当您找到非字母数字字符时,程序会移动hold指向字符串的其余部分,但不会重置i。这意味着你继续从新的hold指针进行迭代,该指针位于原始指针的中间位置,加上当时正好发生的i。这样做可能至少会跳过一堆字符,并且可能会让你开始对字符串之外的内存进行操作,这肯定是坏消息。

答案 1 :(得分:0)

可能是因为您在循环中更改了hold的值,因为在每次迭代时都会重新评估strlen(hold)。解决方案可能是在进入strlen(hold)循环之前保存for的值。