请解释此输出。问题与scanf相同。如何每次重新初始化阵列?
输入:
create-drop
输出:
HelloWorld
Tech
代码:
eo
Tech
TW
答案 0 :(得分:0)
请更正您的指示。你可能想要使用2个,3个,4个空格,但1个看起来不对。我没有看到使用string.h
库。
数组未清除,但0..3字符替换为新字符,位置4上的字符为\0
。这就是为什么你可以从这个数组中第5位的先前输入值读取字符。
答案 1 :(得分:0)
在C中,字符串存储为null-terminated个字符数组。这意味着有很多方法可以表示相同的字符串:忽略第一个空字节后的字符数组中的所有内容,只要涉及字符串的值。
当第一个gets
来电显示为HelloWorld
时,它会将字符'H'
存储在c[0]
,'e'
中c[1]
,...,{ 'd'
中的{1}}和c[9]
中的0(这是空字节,而不是'0'
)。 c[10]
到c[11]
的内容不变。
当第二个c[1023]
来电显示为gets
时,它会将Tech
中的字符'T'
存储在c[0]
中的'e'
,{{1}在c[1]
中,'c'
中的c[2]
和'h'
中的0。 c[3]
到c[4]
的内容不变。特别是,c[5]
仍然具有第一次c[1023]
调用设置的值c[5]
。
如果您习惯使用高级语言,您可能会期望W
分配新存储,或者执行看起来像字符串访问的操作可以保证您实际访问字符串,但这些都不是是的。
正如您可能会猜到的那样,您将一个字符数组传递给gets
,它只会写入该字符数组,而不会分配新的存储空间。当gets
读取一个4字节的字符串时,它会写入4字节的字符串加上终止的空字节,并且它不会触及这5个字节之后的任何内容。实际上,gets
甚至不知道数组的大小(这就是为什么gets
在实践中几乎无法使用并且已从当前版本的C语言中删除的原因:如果输入一行这对于数组来说太长了,它会覆盖内存中数组之后的任何内容。
gets
访问位置5的数组gets
的元素。这恰好在字符串之外,但这与数组访问的操作方式无关。它是数组访问权限,而不是字符串访问权限。 C本身并没有真正的字符串:它用字符数组伪造它们。字符串操作函数将其参数视为字符串(即它们只查找第一个空字节)。但是数组访问只是一个数组访问,并且程序员不能访问字符串或数组,超出范围。