我想将哈希数组中的前两个值分配给salt数组。
char hash[] = {"HAodcdZseTJTc"};
char salt[] = {hash[0], hash[1]};
printf("%s", salt);
然而,当我尝试这个时,前两个值被分配,然后所有十三个值也被分配给salt数组。所以我的输出不是:
HA
但是:
HAHAodcdZseTJTC
答案 0 :(得分:3)
salt
不会以空值终止。尝试:
char salt[] = {hash[0], hash[1], '\0'};
答案 1 :(得分:2)
由于您只向v.type
数组添加两个字符,而您没有添加salt
终止符。
将非'\0'
终止的数组作为参数传递给带有nul
说明符的printf()
,会导致未定义的行为,在您的情况下,它会在我的情况下打印"%s"
hash
被打印出来。
c中的字符串使用特殊的对话来知道它们的结束位置,在非HA@
字节序列的末尾附加了一个不可打印的特殊字符'\0'
,并且如何构建交流字符串。
例如,如果您要计算字符串的长度,则可以执行类似
的操作'\0'
当然有更好的方法,但我只是想说明终止size_t stringlength(const char *string)
{
size_t length;
for (length = 0 ; string[length] != '\0' ; ++length);
return length;
}
的重要性。
既然你知道这一点,你应该注意到
'\0'
是char string[] = {'A', 'B', 'C'};
的数组,但不是字符串,因为它是字符串,需要终止char
,所以
'\0'
实际上是一个字符串。
请注意,当您分配空间来存储char string[] = {'A', 'B', 'C', '\0'};
个字符时,您需要分配n
个字节,以便为n + 1
腾出空间。
在'\0'
的情况下,它将尝试使用传递指针指向的所有字节,直到其中一个为printf()
,在那里它将停止迭代字节。
这也解释了未定义行为的事情,因为显然'\0'
会读出界限,任何事情都可能发生,这取决于内存地址实际上是什么不属于传递的数据但是不在界限。
标准库中有许多函数需要字符串,即非printf()
字节的_sequences,后跟nul
字节。