C 为什么我的数组没有正确清空?

C 为什么我的数组没有正确清空?,c,arrays,c-strings,C,Arrays,C Strings,所以我把这个主数组保存在一个临时数组中。然后,我使用“\0”来“删除”主数组中的内容。此时,如果我打印主数组,它将只打印空白。但如果我使用for-to-like主数组=临时数组。如果x=0 x

所以我把这个主数组保存在一个临时数组中。然后,我使用“\0”来“删除”主数组中的内容。此时,如果我打印主数组,它将只打印空白。但如果我使用for-to-like主数组=临时数组。如果x=0 x<4 x++,它会从另一个数组复制四个元素,但它也会打印在我执行'\0'之前的内容

我试了一会儿柜台,但也没用。我以前使用过\0,它很有效,所以我不知道为什么它现在不起作用

for(int y = 0; y <= strlen(numeros); y++){
    numeros[y] = '\0';
}

printf("%s\n", numeros);

for(int z = 0; z <= 4; z++){
    numeros[z] = numerosTemp[z];
}
    printf("%s\n", numeros);
for(int y=0;y提示:



对于(int y=0;y
strlen
计算距离第一个
'\0'
多远。在第一个循环中,在字符串的开头插入一个
'\0'
。然后检查循环条件,瞧,
strlen(numeros)
0
(因为第一个字符现在是NUL终止符),并且
y
(现在有一个值
1
)大于该值,所以完成了

如果您想将其归零,可以存储原始的
strlen
,并将其用于测试。或者您可以完全删除循环,并用
memset
替换它:

memset(numeros, '\0', strlen(numeros));
或者,您可以将循环写入零,直到达到NUL,从而将两次通过的解决方案转换为一次通过的解决方案:

for (int i = 0; numeros[i]; ++i) {
    numeros[i] = '\0';
}

numeros[i]
的结束条件意味着当它达到一个已经是NUL的值时,它停止,在搜索时将非NUL值归零。

从中可以看出,它打印numeros的长度,并在数组的每个空格中保存\0。然后它打印这个空白数组(除了空格外,实际上不打印任何内容\n)然后另一个用于保存前5个元素NavigOTMP在前5个数字空间中,然后只打印这5个保存的空间。实际上,它是打印我之前说过的空白空间。但是,当它只打印被保存的5个空间时,它确实打印了BuffOSTEMMP中的任何5个空间。t它还打印了numeros在执行\0任务之前所拥有的其他内容,这非常有效,我在for中使用了numeros[i]。@DiegoEsquivel:是的。这既是最小的更改,也是最有效的简单解决方案(调整可能会使它更快,但99.9999999%可能不值得)。此解决方案不能很好地随时间扩展,OP需要以某种方式存储大小,如果他想将其归零。@chux:不,它不会;
numeros[i]
总是在NUL分配给该索引之前读取/测试,因此
'abc\0'
将读取
a
,写入
\0
(保留
'\0bc\0'
),增量
i
,读取
b
,写入'\0',(离开
'\0\0c\0'
),增量
i
,等等。
strlen
总是从一开始就扫描,这会导致问题;测试
numeros[i]
总是单独检查您刚写的
NUL
之后的下一个字符。@HanifBinAriffin:它的伸缩性很好;C样式的字符串没有已知的长度,您必须扫描终止的
NUL
。这将扫描与写入
NUL
结合起来,在非
NUL
字节上进行扫描;它可以精确地执行ly
O(n)
工作,读
n
次,写
n
次,这是你能做的最好的大动作。
for (int i = 0; numeros[i]; ++i) {
    numeros[i] = '\0';
}