文字配列の初期化と付与


コードコンパイル実行環境:VS 2017+Win 32+Debug
1.文字配列の初期化方式
C言語で文字列を表すには2つの方法があり、配列とポインタ、文字配列は私たちがよく使う方法です.変数の定義には、変数が属するタイプ、変数名、割当て空間、および初期化が含まれます.変数の初期化は変数定義の一部であることがわかる.const変数に初期化を表示する必要がある場合を除き、他の変数が定義時に初期化を表示しない場合、コンパイラは変数をデフォルト値で初期化します.変数の付与値と初期化には本質的な違いがあり、文字配列もそうです.具体的には私の別のブログを参照してください.認識初期化です.
1.1文字ごとの初期化
文字配列を定義する場合は、文字単位で初期化できます.
char str[10]={ 'h','e','l','l','o'};

指定した文字が文字配列の長さに満たない場合、コンパイラは残りの文字を空の文字'0'に設定します.
1.2文字列定数による文字配列の初期化
C言語では文字列を文字配列として扱うため、文字列を用いて文字配列を初期化することができる.
char str[]={"hello"};

かっこは省略することもできます.
char str[10]="hello";

文字配列の長さに満たない場合は、残りの文字を空白文字'0'にします.したがって、1つの文字配列を空の文字配列に初期化する方法は、次のようになります.
char test1[256]="";
char test2[256]={""};
char test3[256]={0};
char test3[256]={'\0'};

2.文字配列の割り当て
定義が完了した文字配列に値を割り当てる場合、初期化と同様に文字配列に値を割り当てることはできません.次の文はエラーです.
char str[10];       //      (           )
str={'a','d','s'};  //  
str="abc";          //  
str={0};            //  

エラーの原因は、文字配列名が文字配列の宛先を表し、変更できず、左値として使用できないためです.左値の概念はブログを参照:左値と常引用を認識する.
2.1文字ごとの代入
(1)forサイクルの方式.
char str[10];
for(int i=0;istr):++i)
    str[i]='\0';

(2)memset()を用いて値を付与し,forサイクルより効率的であるため,推奨する.もちろん文字配列を空にするのは初期化時に完了すべきで、何度も一挙に行うべきではありません.
char str[10];
memset(str,0,sizeof(str));

2.2コピー付与
既存の文字列を用いてmemcpy,strcpyまたはstrncpyなどの関数によりコピー付与を実現し,参照コードは以下の通りである.
char str[10];
char str2[]="hello";
memcpy(str,str2,sizeof(str2));
strcpy(str,str2);
strncpy(str,str2,strlen(str2)+1);

参考文献
[1]C言語文字配列はどのように初期化しますか?