сбросить массив char * [размер] содержимого - PullRequest
0 голосов
/ 18 января 2010

Скажем, я объявил char * array [size] в моей программе и поместил в него несколько строк. Если я снова назначу им что-то, они не заменяют предыдущее содержимое, а продолжают добавлять к предыдущему. Как правильно очистить / сбросить все его содержимое?

void function(char* action)
{
   const int myMainArrSize = 3;
   char *myMainArr[myArrSize];

   char *myArrOne[] = {"String 1", "String 2", "String 3"};
   char *myArrTwo[] = {"Another String 1", "Another String 2", "Another String 3"};

   if(strcmp(action, "action1")==0)
   {
      for(int i=0;i<myMainArrSize;i++)
      {
         myMainArr[i] = myArrOne[i];
      }
   }

   if (strcmp(action, "action2")==0)
   {
      for(int i=0;i<myMainArrSize;i++)
      {
         myMainArr[i] = myArrOne[i];
      }
   }
}

Ответы [ 4 ]

5 голосов
/ 18 января 2010

У вас есть

char *array[size];

Это делает array массивом указателей. В частности, array - это массив size указателей. Каждый элемент в массиве (array[0] до array[size-1]) имеет тип char *.

Я думаю, это поможет, если вы поймете, как работает array:

+-------+-------+-------+-------+
|  [0]  |  [1]  |  [2]  |  [3]  |
+-------+-------+-------+-------+
    |       |       |       |
    |       |       |       |
    |       |       |       |
    v       v       v       v

Каждое из полей выше представляет указатель, а стрелки указывают на то, куда они указывают. Хранилище для них еще не назначено, поэтому они просто «там» и никуда не годятся. Вы можете создать для них память (malloc() и т. Д., В C, new[] в C ++) или указать их в каком-либо существующем месте.

Вы говорите:

... вставь несколько строк. Если я снова назначу им что-то, они не заменяют предыдущее содержимое, а продолжают добавлять к предыдущему. Как правильно очистить / сбросить все его содержимое?

Непонятно, как вы вкладываете "струны в это". Вы имеете в виду, что храните строки в array[0] .. array[size-1]? Как? Вы присваиваете им буквальные строки? Что-то вроде:

array[0] = "String";

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

array[0] = "Another string";

вы переназначаете указатель array[0], чтобы он указывал на "Another string", и, следовательно, вы не добавляете.

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

Редактировать : На основании ваших изменений указатели myMainArr[i] (для i=0 до i=3), do переназначаются соответствующим элементам с myArrOne myArrOne (не опечатка!), В зависимости от содержимого action. Таким образом, если вы напечатали их (например, printf("%s\n", myMainArr[0]);), вы не должны видеть добавляемых строк. Кроме того, myMainArr является локальным для вашей функции function, поэтому он будет уничтожен, когда ваша функция вернется. (Между прочим, ваш выбор имен array для массива и function для функции затрудняет однозначность ответа на вопрос!)

Если у вас возникли проблемы, пожалуйста, отправьте complete , минимальный , скомпилированный код, который показывает проблему.

0 голосов
/ 18 января 2010

Звучит так, будто вы увеличиваете этот указатель и продолжаете писать там. Вы должны сохранить указатель на начало массива где-нибудь, и когда вы хотите сбросить свой массив символов, вы должны обнулить его содержимое (используя вызов, подобный memset(array, 0, size)) с этим указателем, а затем начать писать обратно туда.

0 голосов
/ 18 января 2010

Если новые строки добавляются к содержимому массива или перезаписываются, это зависит от функций, которые вы используете для добавления данных. Например, strcat() добавляется, а strcpy() перезаписывается.

Если вы просто хотите «обрезать» строку до нулевой длины, достаточно установить первый символ в 0:

array[0] = '\0';
0 голосов
/ 18 января 2010
memset(arr, '\0', size)

или обнулять строки при записи в arr:

int n = min(strlen(str, size - 1));
strncpy(arr, str, n);
arr[n] = '\0';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...