2012-01-24 5 views
1

マイコード:何らかの理由で文字をスキャンし、IF文で使用していますか? (もしchar型の== 'C'){}など、これまで

#include <stdio.h> 

main() 
{ 
    float p_Asphalt = 5.2, p_Concrete = 4.93, p_Stones = 2.21; 
    float c_Concrete = 8.88; 
    float d_Length =, d_Width; 
    char typeOfPaving, c_Curbing; 
    float totalCost = 0; 
    float GST = 1.13, PST = 1.10; 

    printf("asphalt company\n\n"); 
    printf("Length of Driveway: "); 
     scanf("%f", &d_Length); 
    printf("Width of Driveway: "); 
     scanf("%f", &d_Width); 
    printf("\nType of Paving:\n"); 
    printf(" 'A' for asphalt paving\n"); 
    printf(" 'C' for concrete paving\n"); 
    printf(" 'S' for paving stones\n\n"); 
    printf("Select (A,C,S): "); 
     scanf("%c%c", &typeOfPaving); 
    printf("%c", typeOfPaving); 

    if (typeOfPaving == "A") 
    { 
     totalCost = p_Asphalt * (d_Length * d_Width); 
     printf("Concrete curbing? [y/n]: "); 

      scanf("%c%c", c_Curbing); 

      if (c_Curbing == 'y') { 
       totalCost = totalCost + (d_Length * c_Concrete); 
      } 
      else { 
       totalCost = totalCost * GST; 
       printf("Quoted Price of Paving: %f\n", totalCost); 
      } 
    } 
    else if (typeOfPaving == "C") 
    { 
     totalCost = p_Concrete * (d_Length * d_Width); 
     printf("Quoted Price of Paving: %f\n", totalCost); 
    } 
    else if (typeOfPaving == "S") 
    { 
     totalCost = p_Stones * (d_Length * d_Width); 
     printf("Quoted Price of Paving: %f\n", totalCost); 
    } 
} 

、私はコンパイル時に、私は次のような出力が得られます。

:~/> cc assignment1.c ^C 
:~/> 
:~/> a.out 
asphalt company 

Length of Driveway: 123 
Width of Driveway: 123 

Type of Paving: 
'A' for asphalt paving 
'C' for concrete paving 
'S' for paving stones 

Select (A,C,S): A 

:~/> 

何も起こりません。私がscanf("%c%c", &typeOfPaving);を持っている22行目で、私の教授が、最初の%cが16行目の変数d_Widthにデータを入力した後に新しい行文字を格納していると私に教えてくれたので%c%cを使用します:scanf("%f", &d_Width);問題は私が今見ているのは(私は思う?)char typeOfPavingは\ nAを格納していますか? Aだけでなく、私のif文がうまくいきませんか?あれは正しいですか?

は、誰かが私が見た

+0

これは宿題なので、意図的に曖昧になりますが、二重引用符はCの文字列を示し、一重引用符は一文字を示します。あなたは文字列を扱っていませんが、文字列と比較します。 – mikebabcock

+0

あなたの教授があなたを誤って案内しています。もしあなたが 'scanf'で2つの変換指定子を持っているなら、あなたは次の引数に2つのアドレスを持つべきです。 – pmg

+0

@pmg私もそう言っていましたが、... OPは%c%cを使って\ nをスキップするように言われましたが、後で2つの引数を指定してもOKです。 scanfのBtw C Prog Lang(2番目)は 'c'フォーマッタを示しています。次の白以外の文字を読み込むために白い文字をスキップしないので%1sです。 – wmz

答えて

1

あなたのプログラムが誤動作している理由を説明する仮説を立てることでうまくいっています。次の重要なステップは、仮説を確認するか否かをテストすることです。つまり、typeOfPaving\nAとなっていると主張している場合は、どのようにテストできますか?

この場合、問題を解決するために何ができますか?そうでない場合、次の仮説は何ですか?

これを実践すれば、誰かから正確な回答を求めるよりもさらに多くのことがわかります。

1

最初のものは比較typeOfPaving == "A"ある種類のイライラ、笑何をすべきかわからない、私を助けてくださいすることができ、それは文字と間違っている文字の配列は、あります。

あなたのコンパイラはあなたに警告していませんか?また

、あなたがscanfに変数を渡すときに常にパスポインタだけでなく、時には必要があります。 (あなたの変数がもちろんポインタでない限り)。

あなたが持っている店主の%と同じくらい多くのポインタを渡す必要があります。それ以外の場合は問題が起こります。

+2

C '" A "'は 'const char *' 'char [2]'型です(通常は 'char *'型の値に減衰します)。 – pmg

+0

@pmgは実際には 'char const [2]'ではありませんか? –

+0

@SethCarnegie:私の最初のコメントは正確です。文字列リテラルの型は 'N'要素の配列です(すべての文字とNUL終止符のために十分大きな' N'で十分です)。 [the standard](http://port70.net/~nsz/c/c99/n1256.html#6.4.5)の6.4.5を参照してください。 – pmg

2

"C"は、charアレイであり、'C'は、charである。それはあなたがおそらく必要なものです:

if (typeOfPaving == 'C') 
+0

Damnit。実際に面白い話。上に投稿したバージョンは、二重引用符で囲まれた単なる実験でした。私は実際には一度だけ引用符を使っていましたが、それでもうまくいきませんでした。そうすれば、ここでは大部分の回答が無効になります。 – eveo

0

この:

scanf("%c%c", c_Curbing); 

は非常に間違っている、とあなたのコンパイラエラー(または少なくとも警告)を与える必要があります。 scanf()機能は、ポインタを必要とするので、あなたが使用する必要があります。

scanf("%c", &c_Curbing); 

また、それが値を受け取るための変数へのポインタよりも多くの書式指定子を供給するために奇妙です。

最後に、戻り値をチェックして、期待されるデータの読み取りに成功したことを確認する必要があります。

+0

彼は質問に2つの '%c'がある理由を説明しました。 –

+0

@SethCarnegie、はい、でも、どちらのプレースホルダにも対応するポインタが必要です。 –

+0

@ MichaelKrelin-hackerはい、私のコメントは、「変数へのポインタよりも多くの書式設定指定子を供給するのは奇妙です」と言いました。私は、彼がそれをやる理由があったと言っていました。それはだと思った –

関連する問題