3

C プログラミング コースの最終プロジェクトに取り組んでいます。このプロジェクトは、医薬品情報を保管するためのデータベースを作成することです。すべての要素を完成させたので、次はすべてを微調整します。

プロジェクトには、ユーザーが医薬品情報を変更できる関数の要件があります。この要件では、ユーザーは Enter キーを押してフィールドをスキップできる必要があります。たとえば、ユーザーは薬の生産者と数量を変更できます。ユーザーがプロデューサーを変更したくない場合は、Enter キーを押して数量に移動します。

私はインターネットを見回して、ユーザーがプロデューサーの文字列を入力するのをスキップできるようにしました。ただし、整数で機能させることはできません。

これは、ユーザーが文字列の入力をスキップできるようにするために使用したものです。

scanf("%30[^\n]", fentry[found].producer);

わかりやすくするために、fentry.producer は 30 文字の文字列であり、found は整数変数です。

整数入力で同様のことを試みました(編集:整数入力とは、「見つかった」変数ではなく、数量を入力することを意味しました)。何かの入力をスキップできますが、何かを入力すると、ランダムな値が保存されます。

誰でもこれについて行く方法を知っていますか?

4

5 に答える 5

3

を使用するよりもscanf()、ユーザーからインタラクティブな入力を取得するためのより良い方法は、 を使用することfgets()です。この関数は、ユーザーが Enter キーを押すまでの完全な入力行を取得し、解析できるようにそれを返します。

必要に応じて、を使用sscanf()して行から情報を読み取ることができます。標準入力からではなく文字列からデータを読み取ることを除いて、sscanf()ほとんど同じように機能します。scanf()

于 2011-08-07T22:39:00.100 に答える
0
scanf("%29s", fentry[found].producer); while('\n'!=getchar());

これはまったく機能し、厳密に ANSI C に準拠しています。ポータブル。入力バッファがクリアされ、chararray-length がサポートされ、chararray には (終了) '\0' (初期化は不要) が含まれ、配列にはユーザー入力からの '\n' が含まれることはありません。

于 2011-08-08T06:37:09.027 に答える
0

キーボード バッファがコードの問題の原因であると思われます。コードを初めて呼び出すときは、最大 30 文字 (改行文字でない限り) を読み取ります。NEWLINE を読むと終了します。NEWLINE はバッファに残ります。

ただし...再度同じ方法で scanf を呼び出すと、前の呼び出しの NEWLINE がキーボード バッファーに残ったままになります。これは、キーボードからさらに入力を要求する前に読み取られます。NEWLINE はすぐに scanf パターンに失敗し、char 配列は更新されず、メモリの初期化されていない領域を指す char ポインターに残されます。

于 2011-08-08T10:31:48.330 に答える
0

これはどうですか?

char s[50];
fgets(s, 50, stdin);

if(s[0] != '\n') {
    fentry[found].producer = atoi(s);
}

ただし、s からすべてのスペースを削除する必要があります。

于 2011-08-07T22:38:38.417 に答える
0

scanf の前に整数を 0 に初期化しましたか?

于 2011-08-07T23:00:38.117 に答える