【C言語】
2次元配列は止めておけ
(新幹線の停車駅)

warning: initializer-string for char array is too long

警告:文字列長は人間が数えてはダメ
[-Wexcess-initializers]


推奨しない2次元配列

#include <stdio.h>
char station[6][9]={
    "東京",
    "品川",
    "新横浜",
    "名古屋",
    "京都",
    "大阪"
};
int main(void) {
    for(int i=0;i<6;i++){
        puts(station[i]);
    }
}

このプログラムには以下の問題があります。

(1) 文字コードをShift_JISと仮定して
”名古屋”を
全角2byte*3文字+’\0’=7byteと考えると、
UTF-8に変えた時動かなくなります。

(2) 文字コードをUTF-8と仮定して
”名古屋”を
全角3byte*3文字=9byteと考えると、
終端文字’\0’の考慮が無いので
暴走する可能性があります。

(3)こだまの停車駅”三河安城”等(漢字4文字)を追加すると
コンパイルできなくなったり、
コンパイルできてしまったりします
(どちらも困る)。 

(4) 6や9のマジックナンバーが出現し、
番兵を記述できないので、
駅の追加削除の度に複数個所の修正が必要となります

推奨するargument vector形式

#include <stdio.h>
char *station[]={
    "東京",
    "品川",
    "新横浜",
    "名古屋",
    "京都",
    "大阪",
    NULL //番兵を置く
};
int main(void) {
    for(int i=0;station[i]!=NULL;i++){
        puts(station[i]);
    }
}

2次元配列ではなくて
char *argv[]の
argument vector形式で記述すると
問題は解決します。