このコードを検討してください:
char name[]="123";
char name1[]="1234";
そしてこの結果
The size of name (char[]):4
The size of name1 (char[]):5
char[]
のサイズが常にプラス1であるのはなぜですか?
Michaelがコメントで指摘したように、文字列はゼロで終了します。したがって、メモリ内の最初の文字列は次のようになります
"123\0"
どこ \0
は単一の文字であり、ASCII値0です。次に、上記の文字列のサイズは4です。
この終了文字がなかった場合、文字列(またはchar[]
そのことについて)終了しますか?さて、確かにもう1つの方法は、長さをどこかに格納することです。一部の言語はそれを行います。 Cはしません。
sizeof
とstrlen
の違いに注意してください。 1つ目は、データ項目全体のサイズを指定する演算子です。 2つ目は、文字列の長さを返す関数です。これは、割り当てられたスペースの実際に使用されている量に応じて、sizeof
よりも短くなります(文字列のオーバーフローを取得できた場合を除く)。
あなたの例では
_char name[]="123";
_
_'\0'
_が終了するため、sizeof(name)
は4であり、strlen(name)
は3です。
しかし、この例では:
_char str[20] = "abc";
_
sizeof(str)
は20、strlen(str)
は3です。
Cでは、文字列はchar
sの配列として格納されます。認識された終了文字('\0'
あるいは単に 0
)それ以上のメタデータを必要とせずに、文字列へのポインタを渡すことができます。文字列を処理するときは、終了値に達するまで、ポインタが指すメモリから文字を読み取ります。
配列の初期化では文字列リテラルを使用しているため、次のようになります。
char name[]="123";
と同等です:
char name[]={'1','2','3',0};
配列のサイズを3にする場合(文字列を格納していないため、終了文字を使用しない場合は、次を使用します。
char name[]={'1','2','3'};
または
char name[3]="123";
(ありがとうalk)あなたが期待していたようにそれをします。
C(およびおそらくすべてのプログラミング言語-舞台裏)のString
は、ASCII値の_\0
_で終了する文字の配列です。 0の。
_char arr[] = "1234";
_を割り当てるときは、文字列リテラルを割り当てます。これは、デフォルトではnullで終了します(_\0
_はnullとも呼ばれます) ここ 。
Nullを回避するには(文字列ではなくchar
sの配列のみが必要であると想定)、次のように宣言できます_char arr[] = {'1', '2', '3', '4'};
_すると、プログラムは希望どおりに動作します(sizeof(arr)
は4)になります。
name = {'1','2','3','\0'};
name1 = {'1','2','3','4','\0'};
そう
sizeof(name) = 4;
sizeof(name1) = 5;
sizeof
はオブジェクトのサイズを返します。この場合、オブジェクトは配列であり、配列の長さは、最初のケースでは4バイト、2番目のケースでは5バイトであると定義されています。
Cでは、文字列リテラルにnull終了文字が追加されます。
あなたのひも、
char name[]="123";
char name1[]="1234";
次のようになります:
char name[]="123\0";
char name1[]="1234\0";
したがって、サイズは常にプラス1です。ファイルまたは任意のソースから文字列を読み取るときは、文字列を格納する変数に、ヌル終了文字用の余分なスペースが常に必要であることに注意してください。
たとえば、最大サイズが100の文字列を読み取ることが予想される場合、バッファ変数のサイズは101である必要があります。
Cの文字列の末尾にヌル文字が付加されているためです。
あなたの場合はここのように
name[0] = '1'
name[1] = '2'
name[2] = '3'
name[3] = '\0'
name1[0] = '1'
name1[1] = '2'
name1[2] = '3'
name1[3] = '4'
name1[4] = '\0'
すべての文字列は、長さに1を追加するchar nullbyte '\ 0'で終了します。