-3

文字列 Beckham12David を入力すると、予想どおりエラーが表示され、文字列を再度入力するよう求められます。デビッドと入力するとエラーが表示されますが、ベッカムと入力すると文字列が受け入れられます

以下のコード:

    int i=0;
    char str[15];
    cout<<"\n\n Enter String(Only aplhabets)";
    gets(str);
    a:
    while (str[i])
      {
          if (isalpha(str[i]))
          {
          }
          else
          {
          cout<<"\n\nWrong String Entered!!!! Please Enter again";
          gets(str);
          goto a;
          }
          i++;
       }
       getch();
     }
4

4 に答える 4

2

strwhileの値を見てみましょう。

str[15] = "Beckham12David";
                  ^
                cursor   

is_alphaテストは文字で失敗します'1'。でテストし"david"ます。getsから入力を取得し、終了記号stdinを使用して文字列に保存します。\0

str[15] = "david*m12David"; // * as \0, sorry :(
                  ^
                cursor

したがって、カーソルは依然として悪意のある番号を指しています! ただし、 を入力すると、次のようになり"beckham"ます。

str[15] = "beckham*2David"; // * as \0, sorry :(
                  ^
                cursor

したがってwhile(str[i])、false であり、プログラムは終了します。これを修正するにはi、ラベルの直後にゼロに設定する必要があります。

さらに良いことに、C++11 に固執します。

#include <iostream>
#include <algorithm>
#include <string>
#include <cctype>

int main(){
    std::string str;
    int (*isalpha)(int) = std::isalpha;// necessary as std::isalpha is overloaded
    for(;;){
      std::getline(std::cin, str);      
      if(std::all_of(str.begin(), str.end(), isalpha)){
        break;
      } else {
        std::cout << "Please enter only letters\n";
      }
    }
  }
于 2013-08-09T10:29:19.900 に答える
0

同じデバッグ セッションで異なる入力を行ったり、別のデバッグ セッションで各入力を行ったりすることはありますか? それが異なる実行にある場合..それが奇妙であるよりも..それがすべて同じセッションにある場合..それはあなたが持っているバグによるものかもしれません..i別の文字列を入力した後にリセットしていません..正しいコードする必要があります

int i=0;
char str[15];
cout<<"\n\n Enter String(Only aplhabets)";
gets(str);
a:
while (str[i])
  {
      if (isalpha(str[i]))
      {
      }
      else
      {
      cout<<"\n\nWrong String Entered!!!! Please Enter again";
      gets(str);
      i=0;
      goto a;
      }
      i++;
   }
   getch();

i=0新しい文字列の分析を最初からやり直すことに注意してください。

于 2013-08-09T10:23:56.923 に答える
0

やってみました?

 cin >> str;
 cin.ignore(); // if entered more than 15 chars

またはgetl​​ineを試してください

于 2013-08-09T10:21:27.990 に答える
0
  1. 空白を使用しましたか? 例: david_、ここで _ はスペースですか? スペースの isalpha は false を返します。

  2. 今後は、ジャンプ命令 - goto - を避けるようにしてください。

幸運を!

于 2013-08-09T10:54:26.060 に答える