2017-09-30 2 views
0

入力を入力する場所にループを設定する方法を見つけるのが難しく、 は 'e'または 'E'を押して入力を停止します。入力された入力は整数ですが、文字で停止する必要があります。それは私が迷子になる場所です。私はアスキー変換を使用することに関する情報の束を見ましたが、私は効率がどれくらいか分かりません。このコードは壊れていますが、それは私が得る限りです。どんな情報でも役立ちます。char変数内の文字と文字のテスト

int main(void) 
{ 
    char num; 
    int sub; 

    while (sub != 'e' || sub != 'E') { 
     scanf("%d", &num); 
     sub = # 
     printf("%d", num); 
    } 

    return 0; 
} 
+0

私はintが数字を操作するのに最適だと知っていますが、私が知っている限り文字を受け入れることはできません。 – Tavaged

+2

1) 'sub'を初期化してから使用する必要があります。2) '||' - '' && '3)' scanf( "%d"、&num); sub = # ' - >' scanf( "%c"、&num);、sub = num; ' – BLUEPIXY

+1

[ (https://ideone.com/fViI8W) – BLUEPIXY

答えて

0

シンプルです。

#include <stdio.h> 
#include <ctype.h> 

int main(void) { 
    char c = getchar(); 
    int num; 

    while (c != 'e' || c != 'E') { 
     if (isdigit(c)) 
       num = c - '0'; 
     c = getchar(); 
    } 
    return 0; 
} 

ただし、入力を停止する方法としてASCII文字を使用する必要はありません。 -1のEOFを使うことができます。 UNIXシステムではCtrl-D、WindowsではCtrl-Zです。 int c; 一方((C = GETCHAR())!= EOF)

+4

この 'while((c = getchar())!= EOF)' 'c' * needs *を' int'にするために。 – alk

+0

入力いただきありがとうございます – Blaze349

0

int'e'と、'E'の入力を区別するための直接的な方法は、fgets()でユーザ入力のラインを読み取り、それを解析することです。

#define LINE_SZ 80 
char buf[LINE_SZ]; 

while (fgets(buf, sizeof buf, stdin) && buf[0] != 'e' && buf[0] != 'E') { 
    if (sscanf(buf, "%d", &num) != 1) { 
    Handle_other_non_int_input(); 
    } 
    sub = &num; 
    printf("%d", num); 
} 
0

コメントに記されているように、(sub != 'e' || sub != 'E')は常にtrueです。 subが同時にとEになることはありません。

subは、intであり、整数ポインタ(int *)ではありません。 行sub = &num;subnumのアドレスを割り当てます。

そして、subという値は、ループが初期化される前のループの制御式で使用されます。 subはその時点で不確定なガベージ値を持っています。あなたはそれを使用する前にいくつかの価値を持ってそれを初期化しなければなりません。

は、値がその返り値rvに格納されてscanf()によってnumに読み込まれる

int num, rv; 
while(1) 
{ 
    rv=scanf("%d", &num); 
    if(rv==0) 
    { 
     if((num=getchar())=='e' || num=='E') 
     { 
      break; 
     } 
     else 
     { 
      while(getchar()!='\n'); 
      continue; 
     } 
    } 
    printf("\n%d", num); 
} 

を行います。

scanf()は、整数値をフォーマット指定子である%dためnumに読み込まれた場合、この場合1でなければならない成功した割り当ての数を返します。

rv1の場合は数字で印刷されます。さもなければ、それはscanf()によって読まれず、入力バッファで消費されないままになる文字である可能性があります。このデータの最初のバイトはgetchar()によって読み取られ、eまたはEの場合、ループは終了しますが、それ以外の場合は入力バッファが\nになるまでクリアされ、ループの次の反復は印刷が行われます。

関連する問題