2017-02-11 19 views
-1

charをintに変換したい。しかし、通常の方法を使用する場合getchar()の余分な数値でcharをIntに変換する

convertedInt = c - '0'; 

私は結果を印刷するときに余分な負の数を取得します。例えば、入力654と、このコードは出力を生成します

while (c != '\n'){ 
     c = getchar(); 
     convertedInt = c - '0'; 
     printf("%d\n", convertedInt); 
    } 

    //Output 
    4 
    5 
    6 
    -38 

私はちょうどそれを変換せずに文字を印刷する場合、私は、予想される出力を得るために、それはGETCHARとは何かを持っているとは思いません。

+0

負の数を印刷しないif文を記述します。 – Pbd

+1

私はそれが有効な解決策であることに同意しますが、私はそれが気に入らないのです。それはお粗末なようです。私はなぜこれが起こり、if文なしで止めることができるのか知りたいと思います。 (なぜそれが表示されるのかわからない場合は、-38になることはいつも知っていますか?) – frillybob

+1

あなたの文字列には、あなたが気付いていないいくつかの余分な文字があるからです! – Pbd

答えて

4

文字を読む前にテストしています。これを試してみてください:エラー発生時にEOFを返すことができます

int c; 
while ((c = getchar()) != '\n' && c != EOF) { 
    convertedInt = c - '0'; 
    printf("%d\n", convertedInt); 
} 

getchar()こと、またはユーザ信号キーボードからEOFなどcが可能無限ループを回避するために、この値をテストする必要があります。

質問のコードでは、whileステートメントの制御式は、最初にcの値が初期化されていないことをテストしているようです。これは未定義の動作につながります。その後、最後の桁が読み取られて印刷されると、cが再度テストされ、\nではないことがわかります。次にgetchar()が呼び出され、cの値は10で、改行文字の小数点の値はASCIIです。したがって、convertedIntは値10 - 48または-38を取得します。そして最後にcがテストされます。現在は\nに等しく、ループは終了します。

2

getChar()を実行すると、後で\nがチェックされますが、最初に「0」を減算しています。これで置き換えます

while(1){ 
    c = getchar(); 
    if(c == '\n') 
     break; 
    convertedInt = c - '0'; 
    printf("%d\n", convertedInt); 
} 
3

まず、getcharは、通常、最下位バイトの文字コードを含むintを返します。 intが返される理由は、unsigned charの値とは別のEOFの値を返すことができるということです。 EOFは、入力の終わりを示すために使用され、文字入力のように扱われることを意図していません。多くのシステムでは、EOFの値は-1です。

表示されている値は、ASCIIで'\n' - '0' == 10 - 48です。ここで

getchar()から望ましくない入力を処理するための一般的なイディオムです:

while((c = getchar()) != EOF && c != '\n') { 
    if(c >= '0' && c <= '9') { 
     convertedInt = c - '0'; 
     printf("%d\n", convertedInt); 
    } 
} 

同様のチェックが#include <ctype.h>含むとif(isdigit(c))if文の条件を変更することにより、acheivedすることができます。

+0

@DavidBowling。あなたは、絶対に正しい。私は携帯電話を利用していますので、アップデートには長い時間がかかりました –

+0

私のキーボードは2つのスペースを連続して置くことはできません。 –

+0

OPが数字を検証する必要があるかどうかわかりません問題の問題)、それは悪い考えではありません。私は 'ctype.h'関数について言及しています。これらの関数はより移植性の高いソリューションを提供するように設計されているため、一般的に 'c> = '0' && ...'よりもこれらの関数を使うほうがよいことを指摘したいと思います。 –

関連する問題