编写一个程序,在该程序中,我需要将结构链表中的字符串拆分并重新组合。然后,我将新的字符串重新插入到链表中。
我用来构建节点的结构如下所示:
typedef struct CANDIDATENODE
{
char sentence[TARGET_LEN+1];
int rank;
int score;
int goodFlag;
struct CANDIDATENODE *next;
} Candidate;
(TARGET_LEN是最大字符串长度。不包括空终止符,这是中+1的原因
我没有遇到segfault或总线错误,但在复制第三个字符后,下一次通过我的字符串数组填充不属于的字符。在程序的早期,我用随机字符填充了链表中的20个节点。正是从这个节点列表中,我正在传递候选指针
下面的clearPointer指向链表的末尾,我将在这里添加新的句子。
这是Problem方法的全部内容。
void breedSentences(Candidate *can1)
{
Candidate *can2 = can1->next;
char childOne[TARGET_LEN+1];
char childTwo[TARGET_LEN+1];
memset(childOne, ' ', sizeof(TARGET_LEN+1));
memset(childTwo, ' ', sizeof(TARGET_LEN+1));
printf("parent1:%s;n", can1->sentence);
printf("parent2:%s;n", can2->sentence);
int pivot1 = random() %TARGET_LEN-1;
int pivot2 = random() %TARGET_LEN-1;
printf("pivot1= %dn", pivot1);
printf("pivot2= %dn", pivot2);
int i;
for (i =0; i<TARGET_LEN-1; i++)
{
if (i<pivot1)
{
childOne[i]= can1->sentence[i];
}
else
{
childOne[i]= can2->sentence[i];
}
if (i<pivot2)
{
childTwo[i]= can1->sentence[i];
}
else
{
childTwo[i]= can2->sentence[i];
}
childOne[TARGET_LEN]= ' ';
childTwo[TARGET_LEN]= ' ';
printf("First:%cn", can1->sentence[i]);
printf("Second:%cn", can2->sentence[i]);
printf("1:%sn", childOne);
printf("2:%sn", childTwo);
}
printf("%sn", childOne);
printf("%sn", childTwo);
strcpy(clearPointer->sentence, childOne);
clearPointer = clearPointer->next;
strcpy(clearPointer->sentence, childTwo);
clearPointer = clearPointer->next->next;
}
作为一组通用建议:
- 即使将编译器设置为可能的最高警告级别,也要确保程序编译时没有错误。你还没有提到你在哪个平台上,但如果你正在使用gcc,请选择-Werror-Wall等
- 确保您的代码也能在Valgrind或同等版本中幸存下来
- 如果这些对您没有帮助,请使用调试器仔细地单步执行代码中出现问题的部分。GDB(如果你使用它,你还没有说你在哪个平台上)允许你编写一堆这样的东西——这是一个很有价值的工具
Wiz在我的问题下的评论让我找到了答案。使我分配的空间太小导致我的程序出现意外行为。