意外的字符串行为

时间:2013-08-09 10:14:02

标签: c++

如果我输入字符串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 个答案:

答案 0 :(得分:2)

让我们在迭代时查看str的值:

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])为假,您的程序退出。为了解决这个问题,您应该在标签后立即将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";
      }
    }
  }

答案 1 :(得分:0)

你试过吗?

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

或尝试getline

答案 2 :(得分:0)

这是否会在同一调试会话上进行不同的输入或在不同的调试会话上进行每个输入?如果它是在不同的运行..比它是奇怪的...如果它是在同一个会话上...它可能来自你有的bug ... 在输入另一个字符串后,您没有重置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,以便从头开始重新分析新字符串..

答案 3 :(得分:0)

  1. 你使用过白色空格吗? 例如:david_,其中_是空格? isalpha for space return false。

  2. 在将来尝试避免跳转指令 - 转到。

  3. 祝你好运!