すべての文字と数字を問題なく表示する文字列があるという奇妙な問題に遭遇しました。しかし、整数配列では同じことができませんでした。私の知る限り、文字列はNULL
終了文字配列です。では、差別なくすべてを表示するための文字列の違いは何ですか。
どんな助けでも大歓迎です。ありがとう!
このような?:
#include <stdio.h>
int main(void)
{
int a =1;
int array[] = {1,2,3};
const char c = 'a';
char str[] = "hello";
const char char_a[] ={119,111,114,108,100,0}; //ascii codes for world
printf("this is a int: %d\n",a);
printf("this is a int array: %d, prints only the first element of array\n",*array);
printf("this is a int array: %d, prints only the 2. element of array\n",array[1]);
printf("this is a char: %c\n",c);
printf("this is a char array: %c, print only first element of str\n",*str);
printf("this is a char array: %s, prints to \\0 \n",str);
printf("this is a char array(made from numbers): %s, prints to 0 \n",char_a);
return 0;
}
オプション%sは、配列内の要素をcharと見なし、\0に達するまでこれを出力する必要があることをprintfに通知します。
/* 質問に対する答えは一番下にあります。一文かぁ。*/
NULL
char 文字列は、つまり0
値で区切られているため、値printf
に遭遇するたびに停止します。char
次のように、 oneと oneの 2 つの配列があるとint
します。
char char_array[] = { 'a', 'b', 'c', '\0' };
int int_array[] = { 'a', 'b', 'c', '\0' };
今、それらを印刷しようとすると:
printf("char array: %s\n", char_array);
printf("int array: %s\n", (char*) int_array);
次の出力が得られます。
char array: abc
int array: a
int_array を としてキャストしなくchar*
ても、同じことを行います (ただし、コンパイラは文句を言うかもしれません)。しかし、なぜですか?これら 2 つの配列を保持しているメモリを確認してみましょう。(リトル エンディアンで) char_array は以下を保持します: 0x00636261
int_array は保持します (32 ビットごとに区切られます):0x00000061 0x00000062 0x00000063 0x00000000
つまり、文字列を one 、つまり一度に 1 バイトprintf
ずつ読み取ります。char
したがって、int_array を読み取る場合、最初のバイト、つまり0x61
(文字 'a') を読み取ってから、次のバイトにジャンプします。しかし、おっと!次のバイト0x00
( 0x0000 00 61 )! それは文字列の終わりを知らせ、停止します。
次に、int_array の値を次のように設定します。
int int_array[] = { 0x61616161, 0x62626262, 0x63636363, '\0' };
それは今印刷しint array: aaaabbbbcccc
ます!
0x00
値にギャップがなくなったのでprintf
、ゼロに初期化した 4 番目の int に到達するまで単純に出力します。
つまり、int 配列を文字列として出力したい場合は、各 int の最初のバイトの値のみを保持する char 文字列を作成する関数/ラッパーを作成するか、すべての0x00
値が急上昇しました。
したがって、「何が違うのか」というあなたの質問に答えるには、これは C であるため、すべてビットの集まり、つまりプレーンな古いデータです。したがって、唯一の違いは、それをどのように扱うかです。それで、char_array
が継続的に割り当てられ、整列されている場合、リトルエンディアンでchar_array
として使用すると、 ( ) =]の値が得られるに違いありません。*((int*) char_array)
6513249
0x00636261
コンパイラにそれらを印刷するように指示する方法によって、それらが異なります。
あなたが書くとき
printf("%s", charPtr);
charPtr
で終わる文字列として処理する必要があることをコンパイラに伝えNULL
ます。charPtr
に到達するまで、メモリポイントを調べて、各バイトを文字として解釈し0
ます。
ジェネリック配列型に相当するものはありません。