2016-09-27 3 views
-3

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

Если мы прошли «AB CD EF» для этой функции, последний цикл будет печатать

ef then ef then ef 

но если я печатаю каждый элемент массива в первом цикле он будет печатать

ab then cd then ef 

Код

void sort(char* str) 
{ 
    char* a[100]={NULL}; 
    char *tStr2,*min,*temp; 
    tStr2=(char*)malloc(strlen(str)); 
    int i=0,i2=0,j=0; 
    while(i<=strlen(str)) 
    { 
     if(str[i]!=' ' && i!=strlen(str)) 
     { 
      tStr2[i2]=str[i];  //copy every word separately to tStr2[] 
      i2++; 
     } 
     else 
     { 
      tStr2[i2]=NULL; 
      a[j]=tStr2;   //word is complete --> copy it to the array 
      printf("%s \n",a[j]); //print every word 
      j++; 
      i2=0;     //initializes the word counter 
     } 
     i++; 
    } 
    i=0; 
    for (i=0;a[i];i++)   //loop is complete , print all array elements 
     printf("%s \n",*a[i]); 
} 
+0

'std :: string' и' std :: vector' и 'std :: stringstream' являются вашими друзьями здесь. – NathanOliver

+3

Это C или C++? –

+0

1) C не C++ не C. 2) Выберите один из них 3) Отформатируйте код. Он не читается. – Olaf

ответ

0

a[j]=tStr2; копирует тот же указатель на различные элементы, входящие в a[]. Поэтому позже, когда код печатает a[j], он ссылается на текст.

Код должен сохранять различные указатели в различных a[j] элементах. Возможно, это просто, как обычный, но нестандартный, strdup().

a[j] = strdup(tStr2); 

Дополнительный код, необходимый для free() Это распределение.

Альтернативный подход мог бы скопировать str разы и заменить его ' ' с '\0' и имеет a[j] пункт различных начинающие «слова».

+0

, но почему первый printf() печатает правильно, но второй нет? –

+0

@Ahmed M. Salah С вашим кодом 'a [j] = tStr2;' каждый печатает из буфера _same_: 'tStr2'. Вызывается первый цикл 'printf()', 'a [0]' указывает на 'tStr2' и' tStr2 [] 'имеет' 'ab" 'в нем. В следующий раз вызывается первый цикл 'printf()', 'a [1]' указывает на 'tStr2' и' tStr2 [] 'has' 'cd" 'в нем. В последний раз вызывается первый цикл 'printf()', 'a [2]' указывает на 'tStr2' и' tStr2 [] 'имеет' 'ef' 'в нем. Когда вызывается второй 'printf()', 'a [0], a [1], a [2]' все указывают на один и тот же буфер: 'tStr2'. Этот буфер содержит '' ef ''. – chux

+0

wow thanks mate Вы мужчина, который объяснил это поведение, и strdup() работал !!!!, любые дальнейшие советы по улучшению этой части кода –

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