2017-03-01 80 views
0

我正在做一個數字的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 world」。

+0

使用S [長度-1] =「\ 0」; – Daniel

+0

's [length]'在數組邊界之外...即使讀取它也是未定義的行爲。最後一個元素是'[length-1]' – StoryTeller

回答

2

如果你定義結果陣列char s[8],那麼你一定不能寫在8位置類似的東西在s[length] = 0x0length==8,因爲這超出了數組的長度。試試:

char s[9] = {0}; 
printing_binary(s, (9-1), 2); 
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); 
} 
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); 
} 
0

另一種方法是在循環外聲明i。這可以是有用的,如果由於某種原因,你的邏輯跳出循環的到達之前length

int i; 
for (i=0; i < length; i++) { 
    ... 
} 
s[i] = '\0'; 
相關問題