web-dev-qa-db-ja.com

scanfを使用してコンマ区切りの入力を読み取ります

私は次の入力を持っています:

AG23,VU,Blablublablu,8
IE22,VU,FooBlaFooBlaFoo,3
and so on...

次のようなコードを使用してscanfで「解析」したい:

char sem[5];
char type[5];
char title[80];
int value;

while(scanf("%s,%s,%s,%d", sem, type, title, &value) == 4) {
 //do something with the read line values
}

しかし、コードの実行は私に与えます:illegale instructionこのようなコンマ区切りファイルをどのように読みますか?

14
Moonlit

コンマは空白文字と見なされないため、書式指定子"%s",と、配列の境界を超えて書き込む行のすべてsemを使用して未定義の動作を引き起こします。これを修正するには、スキャンセットを使用する必要があります。

while (scanf("%4[^,],%4[^,],%79[^,],%d", sem, type, title, &value) == 4)

どこ:

  • %4[^,]は、最大4文字、またはコンマが検出されるまで読み取ることを意味します。

幅を指定すると、バッファオーバーランが防止されます。

39
hmjd