tags:

views:

122

answers:

4

Say I have declared char *array[size] in my program and put some strings in it. If I assign something again to them, they don't replace the previous contents but they keep on appending on the previous contents. How do I correctly clear/reset all of its contents?

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];
      }
   }
}
A: 
memset(arr, '\0', size)

or nul-terminate the strings when you write to arr:

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

Sounds like you increment that pointer and keep writing there. You must save the pointer to the array's beginning somewhere, and when you want to reset your char array, you should zero its contents (using a call like memset(array, 0, size)) with that pointer, and then start writing back there.

zneak
A: 

If new strings get appended to the contents of the array or overwrite it depends on the functions you use to add the data. For example strcat() appends while strcpy() overwrites.

If you just want to "truncate" the string to zero length it is enough to set the first character to 0:

array[0] = '\0';
sth
+5  A: 

You have

char *array[size];

That makes array an array of pointers. Specifically, array is an array of size pointers. Each element in the array (array[0] to array[size-1]) is of type char *.

I think it would help if you understood how array works:

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

Each of the boxes above represents a pointer, and the arrows are where they are pointing to. The storage for them is not yet assigned to, so they are just "out there", pointing nowhere useful. You can either create memory for them (malloc() etc., in C, new[] in C++), or you can point them to some existing location.

You say:

...put some strings in it. If I assign something again to them, they don't replace the previous contents but they keep on appending on the previous contents. How do I correctly clear/reset all of its contents?

It is not clear how you are putting "strings in it". Do you mean you are storing strings in array[0]..array[size-1]? How? Are you assigning literal strings to them? Something like:

array[0] = "String";

If you are doing that, then, you can reassign to the pointers and the strings wouldn't append. In other words, if later in your program you do:

array[0] = "Another string";

you are reassigning the pointer array[0] to point to "Another string", and thus you're not appending.

So, in short, we need to see more code, and you may need to understand pointers and arrays better.

Edit: Based upon your edit, the pointers myMainArr[i] (for i=0 to i=3), do get reassigned to the corresponding elements from myArrOne or myArrOne (not a typo!), depending upon the contents of action. So, if you printed them (for example, printf("%s\n", myMainArr[0]);), you shouldn't see any strings being appended. Also, myMainArr is local to your function function, so it gets destroyed when your function returns. (Incidentally, your choice of the names array for an array and function for a function make it harder to be unambiguous when answering the question!)

If you are having a problem, please post a complete, minimal, compilable code that shows the problem.

Alok