1

ユーザーが文字や文字列ではなく整数を入力した場合、プログラムをチェックインする必要があります。文字は実質的に整数であるため、それほど悪くはありませんが、ユーザーが一連の文字を入力すると、おかしくなります。

私はこの機能を作りました

int* ask_lung(int* lung)
{
int tmp; // length of a word

cout << "Inserisci la lunghezza della parola da indovinare: ";
cin >> tmp;

if(cin)
{
    // Se i è uguale a o minore di 0 allora ritorna all'inizio

    if(tmp <= 0)
    {
        cout << endl << "\tNon puoi inserire 0." << endl << endl;
        ask_lung(lung);
    }
    else
    {
                    // the error is about here, when it reaches this part of the code it keeps showing the first line "Inserisci la lunghezza della parola da indovinare: "
        *lung = tmp;
    }
}
else ask_lung(lung);

return lung;
}
4

3 に答える 3

2

文字列の場合、ストリームに無効な文字が多数含まれているため、それらの文字のストリームを新しい状態にフラッシュする必要があります。再帰的に行うのではなく、ループで行う方がよいでしょう。これは合理的に十分です。

while(true)
{
  cout << "Please Enter an Integer" << endl ;
  if (cin >> temp)  //true if a leading integer has entered the stream
    break ;
  else
  {
    cout << "Invalid Input" << endl ;
    cin.clear() ;
    cin.ignore(std::numeric_limits<streamsize> :: max(), '\n') ;
  }
}
于 2012-11-30T14:54:33.943 に答える
1

std::all_of次のように使用できますstd::isdigit

std::string input;
std::cin >> input;

if ( std::all_of(input.begin(), input.end(), std::isdigit) )
{
     //input is integer
}

または、テストして整数も必要な場合は、他の回答で示唆されているように、 asinputを使用することをお勧めします。すでに文字列を読んでいる場合は、int使用を検討してください。エラー時に例外std::stoiをスローすることに注意してください。std::stoi

于 2012-11-30T15:05:47.297 に答える
-2

入力は正しく処理されます。問題は、ローカル変数へのポインターを返すことです。その変数はスタック上にあり、関数が戻ると割り当てが解除されます。代わりに、整数へのポインターではなく、整数自体を返す必要があります。

編集:実際には、整数へのポインターを返していないことがわかります。ポインターが指す整数に割り当てています。それでも、整数そのものを返す方がよいでしょう。

于 2012-11-30T14:56:02.237 に答える