1

変数のユーザー入力を取得したいのですLが、scanf関数が機能していません。何かを入力しようとすると、プログラムがジャンプして次のコストステートメントを出力し、終了します。私はCを初めて使用しますが、ここで助けが得られることを願っています。ありがとう。以下のコード:

 #include <stdio.h>
 #include <conio.h>

 int main()
 {
    float L = 0; // L is litre
    float gallon;
    gallon = 3.785 * L;
    char x[2] = {'u', 'd'}; // u is unleaded and d is diesel
    float cost;
    printf("Hello, welcome to PetrolUpHere!!\n");
    printf("Would u like unleaded or diesel fuel?");
    scanf("%s", &x[2]);
    printf("Enter the litre you want to fuel:");
    scanf("%.2f", &L); //SCANF NOT WORKING
    switch (x[2]) {
        case 'u':
            cost = 1.98 * gallon;
            printf("The cost is :%.2f ", cost);
            break;
        case 'd':
            cost = 1.29*gallon;
            printf("The cost is :%.2f ",cost);
            break;
    }
    getch();
    return 0;
}
4

3 に答える 3

2

ここにはいくつかの問題があります。

scanf("%s", &x[2]);

文字列を変数に読み込みたいと思いますxx代わりに、「ポイントを過ぎた2つの位置のメモリに文字列を読み込む」と言っています。この場合、そのメモリは範囲外になります。気にするのは1文字だけなので、これを行う必要があります。

char input;
scanf("%c", &input);

あなたのswitch声明も同様に壊れています。x[2]再び範囲外です。input代わりに上記のコードから使用してください。

他の人が指摘しているよう%.2fに、Lで読むときに使用することはあなたがしたいことではありません%f。代わりに使用してください。一般に、変数を読み取るのではなく、フォーマット指定子を使用してそのようなことを行う必要がありscanfます。入力を取得するための特に安全な方法ではないため、最終的には使用しなくなります。

最後に、C文字列がどのように機能するかについてのあなたの理解はせいぜい不安定なようです。これは、これまでCで働いたことがない人、特に初心者プログラマーにとってはかなり紛らわしいトピックであるため、理解できます。ここに1つの説明があります; もっとたくさん、見ればおそらくもっと良いものを見つけることができると確信しています。

于 2012-11-12T02:50:56.800 に答える
2

これだけのコードには(少なくとも)3つの問題があります。

char x[2] = {'u', 'd'};//u is unleaded and d is diesel
float cost;

printf("Hello, welcome to PetrolUpHere!!\n");
printf("Would u like unleaded or diesel fuel?");
scanf("%s", &x[2]);
printf("Enter the litre you want to fuel:");
scanf("%.2f", &L); //SCANF NOT WORKING

switch (x[2]) {
  1. xは初期化される2の配列ですがchar、nullで終了する文字列ではありません。
  2. を使用しますscanf("%s", &x[2])。これは、配列の一部ではないデータに文字列を読み込みますx
  3. x[2]次に、ステートメントで逆参照しますswitch—範囲外のデータに再度アクセスします。
  4. scanf()結果をスキャンできたことを確認するために、どちらの呼び出しもチェックしません。
  5. 読んだ直後に読んだものを印刷することはありません。
  6. 形式の.は無効です。scanf()使用します(最大2桁に制限される"%f"ため、使用したくない場合があります)。"%2f"
  7. 「無鉛またはディーゼル」の質問に答えて入力した内容を実際に言ったことはありません。
于 2012-11-12T02:53:14.533 に答える
0

scanf("%s", &x[2]); する必要があります: scanf("%c", &x[2]);


scanf("%.2f", &L); する必要があります: scanf("%2f", &L);

そして、ガロンを「0.0」で初期化すると、出力は常に「0.0」になります。それがうまくいくことを願っています。

于 2012-11-12T02:53:23.467 に答える