-3

如果我输入一个字符串 Beckham12David,它将按预期显示错误并要求再次输入该字符串。如果我输入david那么它会显示错误但是如果我输入beckham它将接受字符串

下面的代码:

    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

让我们看一下str迭代时的值:

str[15] = "Beckham12David";
                  ^
                cursor   

对 character的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])是错误的并且您的程序退出。为了解决这个问题,您应该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

你有没有尝试过?

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

或者试试getline

于 2013-08-09T10:21:27.990 回答
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
  1. 你用过空格吗?例如:david_,其中 _ 是空格?空间的 isalpha 返回 false。

  2. 以后尽量避免跳转指令 - goto。

祝你好运!

于 2013-08-09T10:54:26.060 回答