重置char * array [size]内容

时间:2010-01-18 05:43:16

标签: c arrays

假设我在程序中声明了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 个答案:

答案 0 :(得分:5)

你有

char *array[size];

这使得array成为一个指针数组。具体来说,array是一个size指针数组。数组中的每个元素(array[0]array[size-1])都是char *类型。

如果您了解array的工作原理,我认为这会有所帮助:

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

上面的每个方框都代表一个指针,箭头是指向它们的位置。它们的存储空间尚未分配,所以它们只是“在那里”,指向无用的。您可以为它们创建内存(malloc()等,在C中,在{+ 1}}在C ++中),或者您可以将它们指向某个现有位置。

你说:

  

...在里面添加一些字符串。如果我再次向他们分配内容,他们不会替换以前的内容,但他们会继续附加到之前的内容。如何正确清除/重置其所有内容?

目前尚不清楚如何将“字符串放入其中”。你是说你在new[] .. array[0]存储字符串?怎么样?你在为它们分配文字字符串吗?类似的东西:

array[size-1]

如果您这样做,那么,您可以重新分配指针,并且不会追加字符串。换句话说,如果你在程序的后期执行:

array[0] = "String";

您正在重新指定指针array[0] = "Another string"; 以指向array[0],因此您不会追加。

因此,简而言之,我们需要查看更多代码,您可能需要更好地理解指针和数组。

修改:根据您的修改,指针"Another string"(适用于myMainArr[i]i=0),执行重新分配至来自i=3myArrOne的对应元素(不是拼写错误!),具体取决于myArrOne的内容。因此,如果您打印它们(例如,action),则不应该看到任何字符串被追加。此外,printf("%s\n", myMainArr[0]);是函数myMainArr的本地函数,因此在函数返回时会被销毁。 (顺便提一下,您为数组选择名称function而为函数选择array会使得在回答问题时更难以明确无误!)

如果您遇到问题,请发送完整的最小可编辑的代码,以显示问题。

答案 1 :(得分:0)

memset(arr, '\0', size)
写入arr时

或nul-terminate字符串:

int n = min(strlen(str, size - 1));
strncpy(arr, str, n);
arr[n] = '\0';

答案 2 :(得分:0)

听起来像你递增指针并继续写在那里。你必须将指针保存到某个地方的数组开始,当你想重置你的char数组时,你应该用它的指针将其内容(使用memset(array, 0, size)之类的调用)归零,然后开始写回那里。

答案 3 :(得分:0)

如果新字符串被附加到数组的内容或覆盖它,则取决于用于添加数据的函数。例如,strcat()会在strcpy()覆盖时附加。

如果您只想将字符串“截断”为零长度,则将第一个字符设置为0就足够了:

array[0] = '\0';