什么导致我的c ++代码中出现断言错误?

时间:2017-12-06 08:08:54

标签: c++ c-strings

我正在验证一个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;
    }
 }
}

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];
    ...

代替。