0

私は C が初めてなので、演習として 16 進数から base64 へのエンコーダーを作成しています。出力?

const char * hex_to_base64(const char * s) {
  int i;
  for(i = 0; i < strlen(s)/3; i = i + 3) {
    char str[3];
    str[0] = s[i];
    str[1] = s[i+1];
    str[2] = s[i+2];
    printf("%s\n", str);
  }
  return NULL;
}

int main() {
  const char * x = "4453def6d206b696c6c696e6720796f757220627261696e206c696b652061222226f789436f6e6f5573206dabb7368726fa4b2";
  hex_to_base64(x);
  return 0;
}

そして、私はこの出力を得ています:

445
3de^C
f6d^F
206 
b69^L
6c6^O
c69^R
6e6^U
720^X
796^[
f75^^
722!

printfの最後にカラット文字のコンボが表示される理由を誰かが説明できますか?

4

3 に答える 3

3

ゼロではない文字列を printf() に渡しています。変化する:

char str[3];

char str[4];
str[3] = '\0';

さらに良いことに、宣言とゼロ代入をループの外に移動します。

于 2013-06-12T03:47:48.180 に答える
1
char str[3];
str[0] = s[i];
str[1] = s[i+1];
str[2] = s[i+2];
printf("%s\n", str);

strnull で終了する必要があります。str宣言を次のように変更する必要があります。

char str[4] = {0};
于 2013-06-12T03:46:21.240 に答える
0

他の人はすでにあなたのプログラムのバグを指摘していますが、あなたの質問は「なぜカラット文字の組み合わせが表示されるのか」でした。それに対する答えは、キャレット文字の組み合わせが端末のさまざまな非印刷文字の表現であるということです印刷しようとしている (前述のバグのため)。

于 2013-06-13T20:14:07.743 に答える