我正在验证一个cstring来检查它是否有一个大写字符和一个数字,以及它是否循环结束。我的代码的validatePassword函数导致断言错误。用户名是字符数组。 Fail是一个布尔数组,如果cstring确实需要满足输入验证要求,则更改为1。正在从文本文件中读取cstrings。 U_SIZE是cstring的大小。
断言错误说: 表达式:c> -1&& c< 255
int main()
{
run();
return 0;
}
void run()
{
fstream inFile;
const int U_SIZE = 20;
const int P_SIZE = 20;
const int F_SIZE = 9;
int x = 0;
char user[20];
user[19] = NULL;
char username[U_SIZE];
username[19] = NULL;
char password1[P_SIZE];
password1[19] = NULL;
char password2[P_SIZE];
password2[19] = NULL;
bool fail[F_SIZE] = { 0, //fail[0]
0, //fail[1]
0, //fail[2]
0, //fail[3]
0, //fail[4]
0, //fail[5]
0, //fail[6]
0, //fail[7]
0}; //fail[8]
inFile.open("user_data.txt", ios::in);
inFile >> x;
inFile.ignore();
for (int i = 0; i < x; i++)
{
loadData(user, username, password1, password2, inFile);
validateUsername(username, U_SIZE, fail, F_SIZE);
cout << " " << endl;
}
}
void loadData(char user[], char username[], char password1[], char
password2[], fstream &inFile)
{
inFile.getline(user, 20); //read user
inFile.getline(username, 20); //read username
inFile.getline(password1, 20);// read password 1
inFile.getline(password2, 20); // read password 2
}
void validateUsername(char username[], const int U_SIZE, bool fail[], int
F_SIZE)
{
char c;
char cTwo;
if (strlen(username) >= 10)
{
fail[0] = 0;
}
else
{
fail[0] = 1;
}
for (int i = 0; i < U_SIZE; i++)
{
c = username[i];
if (isupper(c) != 0)
{
fail[1] = 0;
i = U_SIZE;
}
else
{
fail[1] = 1;
}
}
for (int i = 0; i < U_SIZE; i++)
{
cTwo = username[i];
if (isdigit(cTwo) != 0)
{
fail[2] = 0;
i = U_SIZE;
}
else
{
fail[2] = 1;
}
}
}
答案 0 :(得分:1)
问题是你走出了你的字符串,你没有检查循环中的终结符或字符串的结尾:
for (int i = 0; i < U_SIZE; i++)
{
c = username[i];
...
username
中字符串的长度为strlen(username)
。除此之外,数组的内容可能无法正确初始化,其内容为 indeterminate 。使用不确定的值,即使只读它们,在C ++中也是未定义的行为。
使用
for (int i = 0; i < strlen(username); i++)
{
c = username[i];
...
代替。