18

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

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
}

しかし、コードを実行すると、次のようになります。illegal instruction

このようなコンマ区切りファイルをどのように読み取りますか?

4

3 に答える 3

50

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

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

どこ:

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

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

于 2013-02-26T14:20:05.963 に答える
0

scanf( "%d%* c");を使用できます。//入力の取得をスキップする文字を抑制します

scanf( "%d%* c%d"、&a、&b);と仮定します。// i / pは31,42%*抑制に使用o / p:3142

任意の文字/、。.....。

于 2020-08-23T06:16:09.137 に答える
-1

あなたが抱えている問題は、あなたが言うとき

 scanf("%s,%s,%s,%d", sem, type, title, &value) 

何が起こっているのかというと、あなたがやろうとしているのは、すべての行をたった5文字の最初の文字列に合わせているということです。したがって、sem[5]あふれ、あらゆる種類の面白いものを落ち着かせます。この問題を回避するために、式を使用してみまし%[^,]たが、うまく機能していません。最善の策は、次のようなものを使用することです

while(scanf("%s%c%s%c%s%c%d", sem, &ch, type, &ch, title, &ch, &value) != EOF)

次に、を破棄できますchgetchar()ただし、ある意味ではるかに高速で安全な、などの入力を読み取るために他の関数を使用する方がよいことを覚えておいてください。

于 2013-02-26T14:51:50.750 に答える