尝试终止char数组并在之后打印

时间:2017-03-01 21:12:48

标签: c arrays char

我正在制作数字的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;一切都好。

4 个答案:

答案 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';