假设我在程序中声明了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];
}
}
}
答案 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=3
或myArrOne
的对应元素(不是拼写错误!),具体取决于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';