我试图找到两个单词之间的前缀,但似乎我所拥有的不正确。首先if(strlen(root) == 0)
总是评估为0.为什么?
The longest common prefix of astrophysics and math is 0��. // <<--- why does this get printed? //
答案 0 :(得分:2)
您的root
包含垃圾值,您需要将其初始化
在你的while循环之后,
root[i]='\0';
现在,试试吧。
答案 1 :(得分:2)
C中的字符串由\0
字符终止。 strlen
返回第一个和终结符之间的字符数。由于您正在动态构建字符串而不附加终结符,strlen
将在第一个内存和内存之间返回任意数量的字符,它会遇到终结符(或者只是因为分段错误而失败) ,出于同样的原因)。
要解决此问题,您应该添加此处理:
root[0] = '\0';
while(first_word[i] == second_word[i])
{
printf("root[%d] = %s\n", i, root);
root[i] = first_word[i];
root[i+1] = '\0';
i++;
}
答案 2 :(得分:1)
你需要null-terminate root:
while(first_word[i] == second_word[i])
{
/* printf("root[%d] = %s\n", i, root); Can't print root here - it isn't null-terminataed yet */
root[i] = first_word[i];
i++;
}
root[i] = '\0';
答案 3 :(得分:0)
首先,不要在root
初始化之前执行此操作:
printf("root[%d] = %s\n", i, root);
root
的内容未定义,通过打印它,你让printf()
打印任何垃圾值root
保持,可能会偏离边界,直到找到空字节。< / p>
您的问题是您没有终止root
。首先,修复循环。如果两个单词相同,则它将访问越界位置。所以,你的循环条件应该是:
while(first_word[i] == second_word[i] && first_word[i] != '\0')
然后,在循环之后放置它:
root[i] = '\0';