2016-11-09 10 views
-1
do 
{ 
    e=0; 
    cout << "Enter input of base " << base << ": "; 
    cin >> input; 
    for (i=0; i<input.length(); i++) 
    { 
     if (input[i]=='A') 
      value=10; 
     else if (input[i]=='B') 
      value=11; 
     else if (input[i]=='C') 
      value=12; 
     else if (input[i]=='D') 
      value=13; 
     else if (input[i]=='E') 
      value=14; 
     else if (input[i]=='F') 
      value=15; 
     else 
      value=input[i]; 

     if(value>=base) 
     { 
      cout << "Invalid input data for your input base!!!" << endl << endl; 
      e=1; 
     } 

    } 
}while (e==1); 

ユーザーキーが101101とし、ベースが2のときは、無効に6回出力されます。エラーは何ですか?doでの文字列のチェック中while

npos、find()を使用しようとしましたが、機能しませんでした。ここで

+0

はしご – Real73

答えて

2

value=input[i]; 

あなたは文字'0'の値が0で、文字'1'の値が1(と同様に他の数字のため)であると仮定しているようです。システムが使用している文字エンコーディングの仮定は間違っています。実際には、'0'は、文字列の終わりを指定するヌルターミネーター文字用に予約されているため、値0で表すことはできません。

ありがとう、私は次に何をすべきですか?

別の文字から値を減算すると、それらの文字の表現の間の距離が与えられます(文字を減算すると0になります)。数字の文字は連続していることが保証されています(0は直前の1が2の直前です)。これらの公理を考えると、文字から'0'の値を引いた値が、あなたが探している価値を与えることを証明するのは簡単です。

+0

**ありがとうございます**しかし、私は次に何をすべきですか? –

1

置き換えます

else 
    value=input[i]; 

をして:

else 
    value=input[i] - '0'; 

ので:あなたはif..elseを避けスイッチケースを使用する必要があります

'0' を=の0x30の= 48

+0

さらに、すべてのコードを数行にしか最適化することはできませんが、それは問題の範囲外です。 –

+0

**ありがとうございました:)**コードを最適化する方法は? –

+2

最後の行までうまく答えました。それは、それが可能な適合文字コーディングの1つに過ぎないと言及していませんでした。この[[文字列を数値に変換する]](/ a/26227523)の回答を参照してください。 –