2012-02-10 9 views
3

私はC言語の学習に取り組んでおり、最近完成したPythonの本の練習問題を使っています。私のCの本は郵便に入っていますが、私は頭を打ちたいと思っていました。私は簡単な温度変換プログラムを組み立てていました。なぜなら何らかの理由でそれがいつも私の条件の 'Else'句にジャンプしています...私は何か単純なものが欠けていると確信していますが、それを理解できないようです。任意のアイデア?:C - 条件付きで常に「Else」にジャンプしますか?

#include<stdio.h> 

main() 
{ 
float temp_c, temp_f; 
char convert_from[1]; 

printf("Convert from (c or f): "); 
scanf("%c", &convert_from); 

if(convert_from == "c") 
{ 
    printf("Enter temperature in Celsius: "); 
    scanf("%f", &temp_c); 

    temp_f=(1.8*temp_c)+32; 

    printf("The temperature in Fahreinheit is: %f \n", temp_f); 
} 

else if(convert_from == "f") 
{ 
    printf("Enter temperature in Fahreinheit: "); 
    scanf("%f", &temp_f); 

    temp_c=(temp_f/1.8)-32; 

    printf("The temperature in Celsius is: %f \n", temp_c); 
} 

else 
    printf("Invalid choice. \n"); 

} 
+0

する必要があり、それは他の決勝にジャンプします。 – cgc

答えて

7

あなたは文字を比較している場合は、この操作を行います。

char convert_from; 

printf("Convert from (c or f): "); 
scanf("%c", &convert_from); 

if (convert_from == 'c') 
{ 

をそうしないと、そのように(二重引用符に注意してください)"c"文字列リテラルとの比較を行うことはできません。式において

+1

元のコードで何が起きているのか詳しく説明しています... 文字列は他の言語ほど簡単ではありません。オリジナルの問題文で(convert_from == "c")を実行すると、その文字列に 'c'だけの新しい 'string'が作成され、convert_fromと同じ文字列*かどうかがチェックされます(これは、 *新しい*文字列なので)、常にfalseになります。 代わりに文字列を使用できますが、strcmp(convert_from、 "c")が必要です。文字列が等しい場合は0を返します。 – Rophuine

+0

私が提案したものを使用すべきではありません - それは別のバグの可能性を開きます - なぜそれがうまくいかなかったのか説明したかっただけです。 – Rophuine

+0

それは意味があります、説明をありがとうございます。 – cgc

2

if (convert_from == "c") 

convert_fromアレイはcharへのポインタに変換され、あなたは基本的にcharに別のポインタにcharへのポインタを比較しています。 "c"は文字列リテラルですが、'c'charです(最初のケースでは""、次のケースでは''の使用に注意してください)。 char convert_from[1];宣言で

、ここで正しいコードになります:

char convert_from[1]; 
scanf("%c", convert_from); 
if (convert_from[0] == 'c') 

が、代わりに、直接charのアレイ1のcharを使用する方が自然である:

char convert_from; 
scanf("%c", &convert_from); 
if (convert_from == 'c') 
1

まあ2ここの問題。

まず:あなたは(char convert_from[1]が行ったように)ので、代わりにサイズを1と文字の配列の

char convert_from; 

を宣言し、唯一の単一の文字を読むことをお勧めします。

そして第二に、あなたは実際には単一の文字に比較する必要があるので、「foo」が今度はポインタであるCの文字列であるので、あなたが、代わりに「C」の

if (convert_from == 'c') ... 

を行う必要があります定数 文字配列(const char *)までです。

さらに、どのコンパイラを使用しましたか? Mine(llvm-gcc 4.2)は、この問題について私に警告しました。だからあなたのコンパイラはかなり偽であるか、またはあなたは緊急にコンパイラの警告に注意を払う必要があります。

+0

gcc(Debian 4.4.5-8)4.4.5 - なぜ私はそれらの警告を得ていないのだろうか...それはエラーなしでコンパイルして実行しましたが、毎回最後のelseステートメントにジャンプしましたか?それは今でも働いています、そしてなぜ私は説明の後に理解します。みんな、ありがとう! – cgc

+0

私のコンパイラはこう言っています:test.c:In function 'main': test.c:27:警告:フォーマット '%c'は 'char *'型を予期しますが、引数2は 'char(*)[1]' '%2!'はタイプ 'char *'を想定していますが、引数2は 'char(*)[1]'の型を持っています。もっと ;) –

1

Cでは、==を使用して文字列を比較することはできません(文字列のメモリ位置を変更するとどうなりますか?比較すると、ほとんどの場合異なる結果が得られます)。

scanf("%c", &convert_from);が間違っています。配列自体はすでにポインタに崩壊するので、scanf("%c", convert_form);で十分です。しかし、この場合、convert_formには、Cライブラリが文字列とみなすものは含まれません(文字列はCでヌル終端されます)。あなたのコードが動作するように取得するための低侵襲変更は

if (covert_form[0] == 'f') [...] 

if (convert_from == "f") [...] 

を変更することになる(基本的にはちょうどである文字リテラルであり、これは、「」ではなく「」のを気にしたがって、==を使用して比較することができます)。これを行うには

より多くの慣用的な方法は、上記と同じを達成することになる、char convert_formとしてconvert_formを宣言してからscanf("%c", &convert_form);を使用することです。

0

まず第一に、あなたが が

のchar convert_fromとして定義し、同時に複数の文字を読んでいるからです。

それが直接文字列を比較する ことはお勧めできませんので、次の文は、そのことについて申し訳ありません

if(convert_from == 'c') 
関連する問題