我正在制作一个程序来解析一行中的单词,当一个单词遇到一个非字母数字字符时,它会向树中添加一个单词。一行中没有空格,一切都很顺利。但是,当存在非字母数字字符时,有问题的循环(从代码中注释的行开始)的大小减半!
为什么循环减半?
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;
}
答案 0 :(得分:5)
当您找到非字母数字字符时,程序会移动hold
指向字符串的其余部分,但不会重置i
。这意味着你继续从新的hold
指针进行迭代,该指针位于原始指针的中间位置,加上当时正好发生的i
。这样做可能至少会跳过一堆字符,并且可能会让你开始对字符串之外的内存进行操作,这肯定是坏消息。
答案 1 :(得分:0)
可能是因为您在循环中更改了hold
的值,因为在每次迭代时都会重新评估strlen(hold)
。解决方案可能是在进入strlen(hold)
循环之前保存for
的值。