2015-08-19 3 views
1

Проблема в том, что всякий раз, когда я изменяю содержимое studName, содержимое внутри studArr тоже меняется.C - Сохранение массива символов несколько раз в массиве 2d char *

Если вход выглядит следующим образом (AAA,BBB,CCC) я первый магазин AAA внутри studName, а затем хранить studName в studArr.

Я пытаюсь сделать:

studArr[0][1] = "AAA" 

studArr[0][2] = "BBB" 

studArr[0][3] = "CCC 

, но когда я использую этот код все из них равное CCC. Есть ли способ исправить это?

for (j = 0; j < NumCourses + 1; j++){ 
    i = 0; 
    k = 0; 
    while ((c = fgetc(ifp)) != ')'){ 
     if (c == ','){ 
      studName[3] = '\0'; // ends sting with null char 
      studArr[j][k+1] = studName; 
      k++; 
      i = 0; 
     } 
     else{ 
      studName[i] = c; 
      i++; 
     } 
    } 
    studName[3] = '\0'; // ends sting with null char 
    studArr[j][k+1] = studName; // store studName in studArr 

} 
+0

Добро пожаловать в переполнение стека! Пройдите [tour] (http://stackoverflow.com/tour) и прочитайте [Как спросить] (http://stackoverflow.com/help/how-to-ask), чтобы узнать, чего мы ожидаем от вопросов здесь. –

+0

Что такое 'studArr'? –

+0

char * studArr [NumCourses] [1024]; char studName [3]; , где NumCourses является константой – IVRafa

ответ

4

с заданием:

studArr [J] [K + 1] = studName;

Вы храните указатель на символ [] имя_шт. Вы должны выделить память для каждого экземпляра, как здесь:

studArr[j][k+1] = strdup(studName); 

Примечание: помните, чтобы освободить выделенную память.

+0

Спасибо, это было то, что мне было нужно !!! – IVRafa

1

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

Нужно указать дубликат строку вместо того, чтобы просто назначить указатель. Либо используйте strdup (это означает, что вам нужно освободить память позже), либо сделать каждую запись массивом и скопировать в нее.

2

studName - указатель, и каждый studArr[j][N] устанавливается на тот же указатель. Содержимое , найденное указателем, обновляется, но все дубликаты копий одного и того же указателя покажут только последнее содержимое.

Возможно, вам необходимо использовать strncpy() или тому подобное. Конкретные детали действительно зависят от кода, который вы еще не показывали, например объявлений.

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