C ++验证驾驶执照程序

时间:2013-12-22 21:51:27

标签: c++

我一直在撞击这个大约2个小时,所以我决定再戴上第二个或更多的眼睛。如果您可以提供帮助,我将不胜感激,如果答案是c ++或逻辑,那么就不会感到困扰,只是无法理解为什么它不起作用。 (我得到的问题是“字符串下标超出范围”,这是在运行时发生的)程序应该在字符串中加入9个char,前5个应该是数字,最后4个应该是字母。

cout<<"please enter in licence number :";
cin>>licence;
while(licence.length()!=9)
{
  cout<<"Sorry please re-enter licence should be 9 characters"<<endl<<"first 5 are numbers last 4 are Letters :";
  cout<<"please enter in licence number :";
  cin>>licence;
  system("CLS");
}
for(int i=0;i<=4;i++)
{
  for(int j=4;j<=9;j++)
  {
    while(!isdigit(licence[i])&&!isalpha(licence[j]))
    {
      cout<<"Sorry please re-enter licence should be 9 characters"<<endl<<"first 5 are numbers last 4 are Letters :";
      cout<<"please enter in licence number :";
      cin>>licence;
      system("CLS");
    }
  }
}

好的,这是我的更新功能,但仍然无法正常工作

bool islicensevalid(string license)
{
   if (license.length() != 9) 
   {
     cout<<"Not nine characters long "<<endl;
     return false;
   }

   for (unsigned short index = 0; index < 5; ++index)
   { 
      if(!isdigit(license[index]))
      {
        cout<<"first 5 characters aren't numbers"<<endl;
        return false;
      }
   }

   for (unsigned short index = 5; index < 9; ++index)
   {    
       if(!isalpha(license[index]))
       {
          cout<<"final 4 characters aren't letters"<<endl;
          return false;
       }
   }
   return true;
}

我再次更改了数字,但它或者有与之前相同的错误,或者说最后4位是字母

3 个答案:

答案 0 :(得分:1)

您应该将验证逻辑分解为单独的验证功能,因为您的输入和验证逻辑过于交织,从而导致您的问题。特别是,如果您在验证循环中发现许可证无效,则不会检查输入的新许可证的长度是否正确,并且您还要在中间重新启动验证。那不好。

最好将问题分开。将验证逻辑放在一个函数中,并让输入循环调用它。这将使一切更清晰,更容易纠正。

bool is_valid_license(const string &license)
{
    // Correct length?
    if (license.length() != 9)
        return false;

    // Are first five characters digits?
    for (int i = 0; i < 5; i++)
        if (!isdigit(license[i]))
             return false;

    // Are next four characters letters?
    for (int i = 5; i < 9; i++)
        if (!isalpha(license[i]))
             return false;

    // Valid license
    return true;
}

然后在输入代码中,您可以执行以下操作:

cout << "Please enter in licence number :";
cin >> licence;

while (! is_valid_license(license) )
{
    cout<<"Sorry please re-enter licence should be 9 characters"<<endl<<"first 5 are numbers last 4 are Letters :";
    cout<<"please enter in licence number :";
    cin>>licence;
}    

答案 1 :(得分:1)

索引9超出范围,即内循环测试应为j < 9,您将在最后一次循环的最后一次迭代中进行测试。

我还认为您需要将j初始化为5而不是4,因此您只需测试licence[5]licence[6]licence[7]licence[8]。< / p>

目前,在外循环的最后一次迭代中,您正在测试`有效地执行此操作:

while(!isdigit(licence[4])&&!isalpha(licence[4]))

哪个应始终评估为true

总而言之,你应该

for(int i=0;i<5;i++) //outer

for(int j=5;j<9;j++) //inner

外环更改实际上是我个人的偏好,我发现它比使用i <= MAX-1样式更常见。

编辑添加: 我注意到,一旦用户输入一个包含9个字符的字符串,就会停止检查长度,没有什么能阻止他们输入9个字符后跟8个字符的无效字符串,这也会导致问题。

答案 2 :(得分:0)

除此之外,你还在阅读INSIDE the loop:

for(int i=0;i<=4;i++)
{
    for(int j=4;j<=9;j++)
    {
        while(!isdigit(licence[i])&&!isalpha(licence[j]))
        {
            cout<<"Sorry please re-enter licence should be 9 characters"<<endl<<"first 5 are numbers last 4 are Letters :";
            cout<<"please enter in licence number :";
            cin>>licence;
            system("CLS");
        }
    }
}

因此,如果第4位数字出错,则从输入中读取。 如果输入的许可证只有3位数,会发生什么?当你从你离开的地方继续你的迭代器时,while条件下的字符串访问将导致崩溃。

为什么你错综复杂的for循环?他们没有关系。

基本上,您应该执行以下操作:

std::string license;
do
{
  cout<<"please enter in licence number :";
  cin >> license;
}
while (!is_license_valid(license));

is_license_valid是执行验证的函数,它将打印错误消息并返回第一个错误:

bool is_license_valid(const std::string& license)
{
   if (license.length() != 9) 
   {
     // print error
     return false;
   }

   for (unsigned long index = 0; index < 4; ++index)
   { 
      // If not digit print error and return false
   }

   for (unsigned long index = 4; index < 9; ++index)
   { 
      // If not alpha print error and return false
   }

   // all tests passed !
   return true;
}