構造体のリンクリストから文字列を分割して再結合する必要のあるプログラムを書く。次に、新しいストリングをリンクリストに挿入します。リンクされたリストの部分文字列
私は、ノードを構築するために使用しています構造体は次のようになります。
typedef struct CANDIDATENODE
{
char sentence[TARGET_LEN+1];
int rank;
int score;
int goodFlag;
struct CANDIDATENODE *next;
} Candidate;
(。TARGET_LENは、最大文字列の長さである1での理由であるヌルターミネータを含まない)
segfaultsエラーまたはバスエラーは発生しませんが、3番目の文字がコピーされた後、次回の文字列配列には、属していない文字が入ります。プログラム内の先に ランダムな文字でリンクされたリストに20ノードを埋めます。このノードのリストから、私が候補のポインタを渡しています。
以下のclearPointerは、新しい文を追加するリンク先の最後を指しています。
ここでは、Problemメソッドの全体を示します。
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;
}
sizeof(TARGET_LEN + 1)= sizeof(int)です。 (Imp def、おそらくあなたのシステムでは4)それはあなたが望むものではありません。とにかくそれがヌル終結しているので、とにかくそれは本当に必要ではありません。 – Wiz
本当に私の問題を引き起こしてくれたおかげで男! – jth41