2017-03-25 13 views
-2

なぜこのコードの加算と乗算のセクションに間違った答えが得られますか?加算と乗算C言語

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    char x, y, z; 
    printf("Enter the calculation: "); 
    scanf("%c %c %c", &x, &y, &z); 

    int a = (int)x; 
    int b = (int)z; 
} 

問題はここにある:

if(y == '+'){ 
    printf("The answer is %d", a+b); 
} 

そして、ここで:

else if(y == '*'){ 
     printf("The answer is %d", a*b); 
    } 
    else{ 
      printf("Use only +, -, /, * signs"); 
    } 
    return 0; 
} 
+2

'x'と' z'の値は何ですか?彼らはキャラクターじゃない?したがって、デバッガを使用する場合は、その答えをすばやく見つけることができます。デバッガの使い方を学ぶ。それは価値がある! (他のユーザー:彼が学ぶように彼がそれを理解させてください) –

+0

一般的に、プログラムを実行するときに何が起こるかを記述します - それは "間違った答え"ですか? – Svaberg

答えて

1

文字x、y、zの値がASCII文字ではない数字です。 ASCIIでは、0〜9の数字は '0'〜 '9'の文字で連続して表されます。文字 '0'のint値は小数点以下で48、文字 '1'は49などです。 Linuxのプロンプトから "man ascii"と入力すると、ASCII文字の完全なリストが表示されます。

したがって、 '0'をint値に変換するには、 '0'を減算すると0が得られます。 ASCIIテーブルで文字が連続しているため、これは10個のASCII文字事故はなく、このように設計されています)。デイビッドが指摘しているように、ASCII以外のエンコーディングもありますが、すべてのエンコーディングでは数字が連続する必要があるので、整数に変換するこの演算は常に機能します。

あなたが「9」から「0」から数値文字で任意のchar型のCを持っているのであれば、あなたはbについて

int i = C - '0'; 

あなたの値を使用して、その数値を得ることができますは間違っている、あなたはキャストを使用してint型にASCII文字値に変換されますが、文字の値を減算することによって、それを変換する必要が「0」:

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
char x, y, z; 
printf("Enter the calculation: "); 
scanf("%c %c %c", &x, &y, &z); 

// Convert ASCII char to int by subtracting value of char '0' 
int a = x - '0'; 
int b = z - '0'; 

if (y == '+') { 
    printf("The answer is %d", a+b); 
} 
else if(y == '*') { 
    printf("The answer is %d", a*b); 
    } 
else { 
    printf("Use only +, -, /, * signs"); 
    } 
return 0; 
} 

int型に文字列を変換する場合は、私たちはこのポストhereで言及E ATOI()関数:

char *myString = "1234"; 
    int myIntVal = atoi(myString); 

これはhttps://stackoverflow.com/a/868508/6693299

0

の複製でxzの値は実装に依存する整数値、必ずしもASCII値です。しかし、そう一つの解決策は、に変更することである、'9'から'0'の値が配列であることが標準によって要求される:

int a = x - '0'; 
int b = z - '0'; 

別の可能性は、atoi()関数(またはそれ以上を使用することであるstrtol()関数、これ入力された文字から文字列を形成するために)エラーチェック機能を追加し、複合リテラル:すべての

int a = atoi((char []){x, '\0'}); 
int b = atoi((char []){z, '\0'}); 
2

まずあなたがユーザーの入力を取るために、文字変数を使用して、変数を整数にそれらを型キャストしていることを理解しています。この型キャスティングは、それらの整数変数にコピーされる文字のASCIIコードの値になります。したがって、入力を3 + 2と入力しても、xには51(ASCIIコード)が含まれ、zには50(ASCIIコード)が含まれ、コードに応じた回答は101になります。 ASCIIコードの場合http://ascii.cl/ また、コードに小さな間違いがあるようです(これは使用されているコンパイラによって異なる場合があります)。場合)。

#include <stdio.h> 
#include <stdlib.h> 



int main() 
{ 
char x, y, z; 
int a; 
int b; 


printf("Enter the calculation: "); 
scanf("%c %c %c", &x, &y, &z); 

a=(int) x; 
b=(int) z; 

if(y == '+'){ 
printf("The answer is %d", a+b); 
    } 
else if(y == '*'){ 
    printf("The answer is %d", a*b); 
    } 
else{ 
    printf("Use only +, -, /, * signs"); 
    } 

return 0; 
} 

このコードは正常に動作します。それでも同じコードを保持したい場合は、単にこれを行います。

int a = x - '0'; 

うまくいくでしょう。

+1

標準では、実行文字セットをASCIIでエンコードする必要はなく、エンコードは実際には必ずしもASCIIではありません。しかし、 '' 0 ''から '' 9 ''までの文字の値は連続シーケンスを形成する必要があり、 'a = x - '0' 'は' x '、どんなエンコーディングが使われようとも。 –