2016-03-19 13 views
0

こんにちは、私のコードのこの部分。入力された値が基数2かどうかをチェックします。 整数値を入力すると動作します。しかし、私は文字の入力を確認するコードを取得したい。どうやってやるの?入力がCであるかどうかを確認する方法は?

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

int main() 
{ 
    int DataForBase1,DataForBase1A,CheckForBase1; 

    printf("For disk1 enter data in base 2: "); 
    scanf("%d",&DataForBase1); 

    DataForBase1A=DataForBase1; 

    while(DataForBase1!=0) 
    { 
     CheckForBase1=DataForBase1%10; 
     if((CheckForBase1!=0) && (CheckForBase1!=1)) 
     { 
      printf("ERROR: This is invalid input for base 2\n"); 
      printf("For disk1 enter data in base 2: "); 
      scanf("%d",&DataForBase1); 
     } 
     else 
      DataForBase1=DataForBase1/10;  
    } 

    system("pause"); 
    return 0; 
} 
+0

そして、それはCが多くの[文字分類機能]を持っていることを良いことだ(http://en.cppreference.com/w/c/string/byte#Character_classification)を検討してください。 ['scanf'](http://en.cppreference.com/w/c/io/fscanf)の正しい書式を使用すると助けになるかもしれません。 –

+0

ユーザは2進数を入力したいので、一度に1文字を読み込む 'for'ループを書くのが最も簡単でしょう。そして' 0 'か '' 1 'のどちらかをチェックします。 – user3386109

+0

'scanf()'ではなく 'fgets()'を使うことを考えますか? – chux

答えて

0

あなたは、現在の入力位置の文字は、あなたがこれを行うことが数を表すものではないことを伝えることができます:

int count = scanf("%d", &DataForBase1); 
if (count == 0) { 
    // Nothing was read 
    ... 
} 

あなたはscanfがゼロに戻ったことを検出した場合、あなたが読んで無視コールド文字列を返し、エラーメッセージを出力し、ループバックして再度数値を読み取ります。

+0

ありがとうございます。でも、12aなどの数字と文字の両方を入力するとどうなりますか? – user302686

+0

@ user302686次に、データを文字列として読み込み、['strtol'](http://en.cppreference.com/w/c/string/byte)などの他の関数を呼び出して個々の部分を分割する必要があります。/strtol)。 – dasblinkenlight

+0

残念ながら、私は他の機能を使用することはできません。 – user302686

1

%dの直後の%cscanf()に使用してください。たとえば

int DataForBase1,DataForBase1A,CheckForBase1; 
char ch; 

printf("For disk1 enter data in base 2: "); 
scanf("%d%c",&DataForBase2, &ch); 

この方法で、

  • あなたは11Dのような数字を入力します、63F など%cは番号の後に余分な文字をアップ食べて
  • ます。 11、63 などのような純粋な数値を入力するとき。 %c\n文字を保持します。したがって、あなたのプログラムはうまくいくでしょう。

PS:あなたは同じコードを掲載していたあなたの他人ばかりの削除 "ポスト、に基づいて入力仮定。

1

この http://www.tutorialspoint.com/c_standard_library/ctype_h.htm

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

#include <string.h> 
#include <ctype.h> 

#define MAX 80 /* max characters to read in */ 


int Parse_String (char str[], int *DataForBase1) 
{ 
     /* do all checking on user input */ 
     /* use functions from ctype.h and string.h */ 
     /* ctype.h will have functions to allow checking if number or character */ 

     int i, len, value; 
     int result = 1; 

     *DataForBase1 = -1; 

     len = strlen(str); 
     for (i = 0; i < len; i++) 
     { 
      if (! isalnum(str[i]) 
      { 
       result = 0; 
       break; 
      } 
     } 

     /* write another for loop here checking every character is either 0 or 1 */ 
     /* and if any is not then set result = 0 and handle accordingly */ 

     i = sscanf(str, "%d", &value); 
     if (i != 1) 
     { 
      *DataForBase1 = -1; 
      result = 0; 
     } 
     else 
     { 
      *DataForBase1 = value; 
     } 

     return result; 
} 

int main() 
{ 
    char str[MAX]; 
    int result; 
    int DataForBase1,DataForBase1A,CheckForBase1; 

    printf("For disk1 enter data in base 2: "); 
    fgets(str, MAX, stdin); 

    result = Parse_String(str, &DataForBase1); 

    if (result == 1) 
     DataForBase1A=DataForBase1; 
    else 
    { 
     /* handle error condition here */ 
    } 

    while(DataForBase1!=0) 
    { 
     CheckForBase1=DataForBase1%10; 
     if((CheckForBase1!=0) && (CheckForBase1!=1)) 
     { 
      printf("ERROR: This is invalid input for base 2\n"); 
      printf("For disk1 enter data in base 2: "); 
      scanf("%d",&DataForBase1); 
     } 
     else 
      DataForBase1=DataForBase1/10;  
    } 

    system("pause"); 
    return 0; 
} 
関連する問題