2017-03-01 4 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の[長さ]'としても、それは未定義の動作である読取...配列の範囲外です。最後の要素は 's [length-1]'です。 – StoryTeller

答えて

2

あなたがchar s[8]としてあなたの結果の配列を定義した場合、これは、配列の長さを超えているため、あなたは、length==8s[length] = 0x0のように位置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

もう1つの方法は、iをループ外に宣言することです。何らかの理由であなたのロジック休憩場合、これはlength

int i; 
for (i=0; i < length; i++) { 
    ... 
} 
s[i] = '\0'; 
関連する問題