我在C中创建一个简单的程序,它检查一些char数组的长度,如果它小于8,我想用零填充一个新数组并将它添加到前一个数组。这就是问题所在。我不知道为什么最后的值是某些迹象(见照片)。
char* hexadecimalno = decToHex(decimal,hexadecimal);
printf("Hexadecimal: %s\n", hexadecimalno);
char zeroes [8 - strlen(hexadecimalno)];
if(strlen(hexadecimalno) < 8){
for(i = 0; i < (8-strlen(hexadecimalno)); i++){
zeroes[i]='0';
}
}
printf("zeroes: %s\n",zeroes);
strcat(zeroes,hexadecimalno);
printf("zeroes: %s\n",zeroes);
答案 0 :(得分:1)
在C中,字符串(如您所知,字符数组)没有任何特殊元数据可以告诉您它们的长度。相反,惯例是字符串在char
值为0
的第一个字符处停止。这称为“空终止”。您的代码初始化zeroes
的方式不会在数组末尾添加任何空字符。 (不要将您使用的'0'
字符与NUL字符混淆 - 它们char
值为48
,而不是0
。)
所有字符串操作函数都采用此约定,因此当您调用strcat
时,它正在查找0
字符以决定开始添加十六进制值的点。
C也不会自动为您分配内存。它假设您确切知道自己在做什么。因此,您的代码使用C99功能动态分配一个数组zeroes
,该数组具有您需要附加'0'
个字符的元素数量。你不为终止NUL字符分配额外的字节,而strcat
也会假设你为hexadecimalno
的内容分配了空间,你有不。在C中,这不会触发边界检查错误。它只是在内存中写道,你不应该实际写下来。因此,您需要非常小心,做分配足够的内存,并且只写入您实际分配的内存。
在这种情况下,您希望hexadecimalno
始终为8位数字,左边用零填充。这意味着您需要一个具有8个char
值的数组,以及一个用于NUL终结符的数组。因此,zeroes
必须是char[9]
。
在为zeroes[i] = '0'
设置正确的零数后,您需要将 next 元素设置为char
值0
。你填零的事实会让事情变得混乱,但请记住,'0'
和0
是两回事。
如果你分配了足够的空间(至少9个字符,假设hexadecimalno
永远不会超过8个字符),那么当你将零填入其中以进行填充时,你将null终止数组,你应该得到预期的结果。