我一直在撞击这个大约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位是字母
答案 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;
}