c中的链表子字符串



编写一个程序,在该程序中,我需要将结构链表中的字符串拆分并重新组合。然后,我将新的字符串重新插入到链表中。

我用来构建节点的结构如下所示:

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; 

}

作为一组通用建议:

  1. 即使将编译器设置为可能的最高警告级别,也要确保程序编译时没有错误。你还没有提到你在哪个平台上,但如果你正在使用gcc,请选择-Werror-Wall等
  2. 确保您的代码也能在Valgrind或同等版本中幸存下来
  3. 如果这些对您没有帮助,请使用调试器仔细地单步执行代码中出现问题的部分。GDB(如果你使用它,你还没有说你在哪个平台上)允许你编写一堆这样的东西——这是一个很有价值的工具

Wiz在我的问题下的评论让我找到了答案。使我分配的空间太小导致我的程序出现意外行为。

相关内容

  • 没有找到相关文章

最新更新