3

私は C の学習に取り組んでおり、最近完成した Python の本からいくつかの練習問題を使用しています。私の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");

}
4

5 に答える 5

7

文字を比較する場合は、次のようにします。

char convert_from; 

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

if (convert_from == 'c') 
{ 

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

于 2012-02-10T23:31:42.340 に答える
2

式では:

if (convert_from == "c")

convert_fromarray は へのポインタに変換されるため、基本的にへのポインタを別の へのcharポインタと比較しています。は文字列リテラルですが、 は a です(最初のケースでの と2 番目のケースでの の使用に注意してください)。charchar"c"'c'char""''

char convert_from[1];宣言を使用すると、正しいコードは次のようになります。

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

charただし、 の配列 1 の代わりにa を直接使用する方が自然charです。

char convert_from;
scanf("%c", &convert_from);
if (convert_from == 'c')
于 2012-02-10T23:34:45.943 に答える
1

ここで 2 つの問題があります。

最初:1文字だけ読みたいので、宣言する

char convert_from;

サイズ1の文字の配列の代わりに(char convert_from[1]そうでした)。

次に、実際に単一の文字と比較する必要があるため、次のようにする必要があります

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

"c" の代わりに、"foo" は C の文字列であり、定数文字配列 ( ) へのポインターであるためconst char *です。

さらに、どのコンパイラを使用しましたか? 私の(llvm-gcc 4.2)は、問題について警告しました。したがって、コンパイラが非常に偽物であるか、コンパイラの警告に緊急に注意を払う必要があります。警告はエラーではないため、これは難しいかもしれませんが、警告には理由があります:-)

于 2012-02-10T23:35:53.690 に答える
1

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

またscanf("%c", &convert_from);、間違っています。配列自体はすでにポインターに崩壊しているので、scanf("%c", convert_form);十分です。ただし、この場合convert_form、C ライブラリが文字列と見なすものは含まれません (文字列は C では null で終了します)。コードを機能させるための最小限の侵襲的な変更は、

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

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

(文字リテラルである "" の代わりに '' に注意してください。これは基本的に単なる数値であり、したがって == を使用して比較できます)。

これを行うためのより慣用的な方法は、 as を宣言convert_formしてchar convert_formから を使用することscanf("%c", &convert_form);です。これは、上記と同じことを実現します。

于 2012-02-10T23:39:30.680 に答える
0

まず、一度に 1 文字しか読み取らないため、次のように定義します。

char convert_from;

次に、文字列を直接比較することはお勧めできないため、ステートメントは次のようにする必要があります

if(convert_from == 'c')
于 2012-02-11T16:20:51.540 に答える