「C言語」の編集履歴(バックアップ)一覧はこちら
「C言語」(2013/05/11 (土) 20:30:03) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
scanf
%cは空白や改行も読み込むので、次の行を読み込んでいると見せかけて
同じ行の改行を読み込んでいることがあります。
対策としては%cを避けて配列を定義し、%sで読み込む方法があります。
C++のcinでは改行や空白は読み込まないので、大丈夫です。
ポインタについて
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 ;