2012-02-25 7 views
1

構造体のリンクリストから文字列を分割して再結合する必要のあるプログラムを書く。次に、新しいストリングをリンクリストに挿入します。リンクされたリストの部分文字列

私は、ノードを構築するために使用しています構造体は次のようになります。

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; 



} 
+3

sizeof(TARGET_LEN + 1)= sizeof(int)です。 (Imp def、おそらくあなたのシステムでは4)それはあなたが望むものではありません。とにかくそれがヌル終結しているので、とにかくそれは本当に必要ではありません。 – Wiz

+0

本当に私の問題を引き起こしてくれたおかげで男! – jth41

答えて

0

私の質問の下でのウィズのコメントは私に答えを導いた。私の割り当てられたスペースを小さくしすぎると、私のプログラムが予期せぬ動作をするようになりました。

0

提案の一般的なセットとして:

  1. あなたのプログラムは、あなたが可能な限り最高の警告レベルにコンパイラを設定してもエラーなしでコンパイルされていることを確認します。 gccを使用している場合は、-Werror -Wallなどに移動してください。
  2. コードがValgrindまたは同等のものであることを確認してください。
  3. これらが役に立たない場合は、デバッガを使用してコードのすべてがうまくいかない箇所を慎重に踏んでみてください。 GDB(もしあなたがそれを使っているなら、あなたはあなたがどんなプラットホームを使っているか言っていない)は、このような種類のスクリプトをあなたのキットに入れておく貴重なツールです。
+0

私はコードを書くためにMacでXcodeを使い、gccでコンパイルして、werror wallを使ってyesにしました。警告はありません – jth41

+0

Valgrindを実行しましたか? – Perry

関連する問題