2012-02-25 2 views
1

Написание программы, в которой мне нужно разделить строки из структурированного списка на куски и перекомпилировать их. Затем я вставляю новые строки в Связанный список.Подстрока связанного списка в c

структуры Я использую для создания узлов выглядит следующим образом:

typedef struct CANDIDATENODE 
{ 
char sentence[TARGET_LEN+1]; 
int rank; 
int score; 
int goodFlag; 
struct CANDIDATENODE *next; 

} Candidate; 

(. TARGET_LEN максимальная длина строки не в том числе нулевого терминатора, который является причиной +1 в)

У меня нет ошибок segfaults или bus, но после копирования третьего символа в следующий раз через мои массивы строк заполняются символы, которые не принадлежат. ранее в программе я заполняю 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; 



} 
+3

sizeof (TARGET_LEN + 1) = sizeof (int). (Imp def, возможно, 4 в вашей системе) Это не то, что вы хотите. Не то, чтобы это действительно было необходимо в любом случае, так как вы все равно обнуляете его. – Wiz

+0

спасибо, что человек действительно вызвал мою проблему! – jth41

ответ

0

Комментарий Wiz по моему вопросу привел меня к ответу. что делает мое выделенное пространство слишком маленьким, потому что моя программа ведет себя неожиданно.

0

В качестве общего набора предложений:

  1. Убедитесь, что программа компилируется без ошибок, даже если вы установили компилятор на самый высокий уровень предупреждения возможного. Вы не указали, на какой платформе вы работаете, но если вы используете gcc, перейдите на -Werror -Wall и т. Д.
  2. Убедитесь, что ваш код выживает Valgrind или его эквивалент.
  3. Если вам это не поможет, попробуйте тщательно пройти через часть кода, где все идет не так, используя отладчик. GDB (если вы используете это, вы не сказали, на какой платформе вы находитесь) позволяет вам сценарий такого рода вещей - ценный инструмент для вашего набора.
+0

im, используя Xcode на mac для написания кода, скомпилировав gcc и yes используя werror wall. нет предупреждений – jth41

+0

Вы запустили Valgrind? – Perry

Смежные вопросы