2014-02-12 3 views
1
char **rhyme; // init my double pointer 
rhyme=inputrhyme(); // calls below function to input the rhyme 

char** inputrhyme(){ 
    char **rhyme, *temp, *token, BUFF[300], s[2]=" "; 
    int length=0; 
    rhyme=malloc(length * sizeof(char*)); 
    printf("please enter a rhyme: \n"); 
    scanf(" %[^\n]",BUFF); 
    token = strtok(BUFF, s); 
    while(token != NULL) 
    { 
     length++; 
     temp=realloc(rhyme, length* sizeof(char*)); 
     if (temp==NULL){ 
      printf("fatal error!\n"); 
      exit(EXIT_FAILURE); 
     } 
     rhyme=temp; 
     rhyme[length-1]=token; 
     token = strtok(NULL, s); 
    } 
    length++; 
    temp=realloc(rhyme, length* sizeof(char*)); 
    if (temp==NULL){ 
     printf("fatal error!\n"); 
     exit(EXIT_FAILURE); 
    } 
    rhyme=temp; 
    rhyme[length-1]=NULL; 

    return rhyme; 
} 

firstNode=sayRhyme(rhyme, firstNode); // goes through the rhyme saying each word 

NodePtr sayRhyme(char **rhyme, NodePtr starting_player){ 
    int index; 
    NodePtr temp=starting_player; 
    printf(" %s\n", rhyme[6]); // works fine for all valid values 
    for (index=0; index<9; index++){ 
     printf("---------%d %s\n",index, rhyme[index]); // problem area 
    } 

это почти весь код, который включает в себя эту рифму. когда я передаю свой двойной указатель на мою функцию, мне нужно только прочитать его, чтобы я не передал указатель на него. я могу прочитать любое значение в рифме, но когда я пытаюсь передать его через цикл, данные будут искажены каким-то образом. это результат, который я получаю:Двойной указатель, который передается, повреждается во время циклов?

please enter a rhyme: 
help im stuck in a computer for real now *user input* 
help 
im 
stuck 
in 
a 
computer 
for 
real 
now 
first word was help 
for 
---------0 help 
---------1 im 
---------2 stuc$ 
---------3 
---------4 
▓ 
---------5 
---------6 for 
---------7 ▄²(
---------8 ≥7vÅ≥7vδ╛ΣW 
player 0 is eliminated 

Я не уверен, что я здесь делаю неправильно. Я попытался передать двойной указатель в виде тройки и почитать его с теми же результатами.

ответ

1

Вы сохраняете свою строку в локальном массиве BUFF, который будет храниться в стеке.

Когда вы вызываете strtok, чтобы разбить его на токены, он вернет указатели обратно в массив BUFF.

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

Вам необходимо сохранить строку в лучшем месте, например. в глобальном массиве или в блоке памяти malloced.

+0

oh, что делает состояние. Я думал, что это было так, как я пропускал двойной указатель. Могу ли я использовать strcpy для копирования поверх строки? –

+0

Вы можете использовать strcpy (хотя strncpy безопаснее), но вам все равно нужно выделить некоторую память для использования в качестве места назначения копии. –

+0

Гоша, что-то еще, я уронил мяч. Забыл malloc за каждое слово ..... Большое спасибо! –

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