C言語


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

scanf %cは空白や改行も読み込むので、次の行を読み込んでいると見せかけて 同じ行の改行を読み込んでいることがあります。 対策としては%cを避けて配列を定義し、%sで読み込む方法があります。 C++のcinでは改行や空白は読み込まないので、大丈夫です。

ポインタについて ポインタ配列とダブルポインタ ダメな例 char **StringArray ; StringArray[0] = "ABCD" ; StringArray[1] = "1234" ;

たまたま、動いたりすることも多いので、コードレビューを細かく行わないと気がつかず、リリース前のテストで、メモリの内容を破壊しまくって慌てるという状況に陥ります。

おかしいのは、ダブルポインタ変数に、配列用の領域を割り当てていないこと。ポインタ配列でなく、わざわざダブルポインタ変数を使うのは、配列の要素数が変動する可能性があるからなので、次のコードは正しいのですが、要素数の変動に対応できません。

char *StringArray[2] ; StringArray[0] = "ABCD" ; StringArray[1] = "1234" ;

 要素数の変動に対応するのであれば、下記のようなコードになります。

// Cの場合 char **StringArray ; StringArray = (char **)malloc( sizeof(char * ) * 要素数 ) ; StringArray[0] = "ABCD" ; StringArray[1] = "1234" ; // 使い終わったらメモリ領域を解放 free( StringArray ) ;

// C++の場合 char **StringArray ; StringArray = new char * [要素数] ; StringArray[0] = "ABCD" ; StringArray[1] = "1234" ; // 使い終わったらメモリ領域を解放 delete []StringArray ;