我正在制作数字的char数组二进制表示。我想用' \ 0'来终止字符串的结尾。它打印除了预期的垃圾值之外的数组。
然而,当我尝试终止数组,特别是垃圾值的索引时,它不会打印出我的字符串。
int main(void)
{
char s[8] = {0};
printing_binary(s, 8, 2);
}
void printing_binary(char *s, int length, unsigned n){
for(int i = 0; i < length; i++){
if(1 & (n >> i)){
s[i] = '1';
}
else{
s[i] = '0';
}
}
//Trying to terminate my string
//s[length] = '\0';
printf(s);
}
此代码会打印出类似01000000}
的内容。
但是如果我取消注释掉s[length] = '\0'
,它就不会打印/程序停止执行。我试过打印出#Hello; Hello world&#34;一切都好。
答案 0 :(得分:2)
如果您将结果数组定义为char s[8]
,那么您不能像8
中的s[length] = 0x0
那样在length==8
位置写任何内容,因为这超出了数组长度。尝试:
char s[9] = {0};
printing_binary(s, (9-1), 2);
答案 1 :(得分:1)
你有一个8位长度,你填写了这些值。例如,值2为00000010
由于您已填满字符串数组,因此您没有空间来结束字符。 如果您将数组大小定义为长度+ 1,那么它将起作用。
int main(void)
{
char s[9] = {0}; // Note size is length+1
printing_binary(s, 8, 2);
}
void printing_binary(char *s, int length, unsigned n){
for(int i = 0; i < length; i++){
if(1 & (n >> i)){
s[i] = '1';
}
else{
s[i] = '0';
}
}
//Trying to terminate my string
s[length] = '\0'; // s must be an array of size greater than length
printf(s);
}
答案 2 :(得分:0)
如果您不想添加空终止符,则只需稍微修改printf。
int main(void)
{
char s[8] = {0};
printing_binary(s, 8, 2);
}
void printing_binary(char *s, int length, unsigned n){
for(int i = 0; i < length; i++){
if(1 & (n >> i)){
s[i] = '1';
}
else{
s[i] = '0';
}
}
//Trying to terminate my string
//s[length] = '\0';
printf("%.*s", length, s);
}
答案 3 :(得分:0)
另一种方法是在循环外声明i
。如果由于某种原因你的逻辑在到达length
int i;
for ( i=0; i < length; i++ ) {
...
}
s[i] = '\0';