编写一个程序,我需要将结构链表中的字符串拆分成碎片并重新组合。然后我将新的字符串插入链接列表。
我用来构建节点的结构如下所示:
typedef struct CANDIDATENODE
{
char sentence[TARGET_LEN+1];
int rank;
int score;
int goodFlag;
struct CANDIDATENODE *next;
} Candidate;
(TARGET_LEN是最大字符串长度。不包括空终止符,这是+1的原因)
我没有遇到段错误或总线错误,但在复制第三个字符后,下一次通过我的字符串数组填充了不属于的字符。 在程序的早期,我用随机字符填充链表中的20个节点。它来自我在候选指针
中传递的节点列表下面的clearPointer指向链接列表的末尾,我将添加新句子。
以下是问题方法。
void breedSentences(Candidate *can1)
{
Candidate *can2 = can1->next;
char childOne[TARGET_LEN+1];
char childTwo[TARGET_LEN+1];
memset(childOne, '\0', sizeof(TARGET_LEN+1));
memset(childTwo, '\0', 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= %d\n", pivot1);
printf("pivot2= %d\n", 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]= '\0';
childTwo[TARGET_LEN]= '\0';
printf("First:%c\n", can1->sentence[i]);
printf("Second:%c\n", can2->sentence[i]);
printf("1:%s\n", childOne);
printf("2:%s\n", childTwo);
}
printf("%s\n", childOne);
printf("%s\n", childTwo);
strcpy(clearPointer->sentence, childOne);
clearPointer = clearPointer->next;
strcpy(clearPointer->sentence, childTwo);
clearPointer = clearPointer->next->next;
}
答案 0 :(得分:0)
作为一般性建议:
答案 1 :(得分:0)
Wiz在我的问题下的评论让我得到答案。使我分配的空间太小导致我的程序出乎意料地行为。