字符串数组与用户字符串比较会产生访问错

时间:2016-03-15 19:36:41

标签: c arrays file

我正在尝试构建一个程序,该程序将从文件中获取list登录详细信息(用户名和密码),并允许您选择输入用户名和密码,并与批准的登录名进行比较结果给出了。在我的strcmp我收到access violation error 0xC0000005

#include <stdio.h>
#include <conio.h>
#include<stdlib.h>

FILE *fptr;
void main();
void openFile();
void closeFile();
char approvedUsrnames[3][6];
char approvedPassword[3][6];


void main()
{
    char userPassword[6], usrname[6], inputChar, fileString[6];
    int i;
    openFile();

    int numofLogins= 3;


    if (fptr != NULL)
    {
        printf("\nReading file with scanf\n");
        while (!feof(fptr))
        {
            for (i = 0; i < 3; i++) {
                fgets(approvedUsrnames[i], 6, fptr);
                fgets(approvedPassword[i], 6, fptr);
            }

        }
        closeFile();
    }


    printf("Enter User name: ");
    scanf("%s",usrname);
    printf("Enter the password <any 6 characters>: ");

    for (i = 0; i<6; i++)
    {
        inputChar = _getch();
        userPassword[i] = inputChar;
        inputChar = '*';
        printf("%c", inputChar);
    }//obfuscate the input to the user

    /*If you want to know what you have entered as password, to be removed*/
    printf("\nYour password is %s:", userPassword);


    for (i = 1; i < 3; i++) {
        printf("\Username is good %s\n", approvedUsrnames[i]);

        if (strcmp(approvedUsrnames[i], usrname  == 0)){
            printf("\Username is good\n");
            if (strcmp(userPassword, approvedPassword[i]) == 0) {
                printf("\nPassword is good\n");
            }//end nested if
            else {
                printf("\nPassword is not match\n");
            }
        }//end if
    }//end for

    _getch();

}
void openFile()
{
    fptr = fopen("approvedLogins.dat", "r");
    if (fptr == NULL)
    {
        printf("Error opening file ! \n");
    }
    else {
        printf("Login file read successfully ! \n");
    }
}
void closeFile()
{
    fclose(fptr);
}

2 个答案:

答案 0 :(得分:0)

@anthonygordon

  1. 很可能字符串usrname和userPassword没有以'\ 0'(空终止符)a)终止,因为scanf()可能会尝试填写比usrname可以捕获的更多字符b) for循环必须只迭代5次,以便userPassword [5]显式设置为'\ 0'。 (如果期望使用6个字符长的用户名和密码,那么将数组的长度从6更改为7并确保数组[6]填充'\ 0')(记住'C'数组下标为0 ..(ARRAYSIZE-1))

  2. 此外,一旦用户名和密码匹配,就会从循环中突破。

答案 1 :(得分:0)

您为用户名和密码字符数组选择了特定长度。这意味着您知道要比较的字符数量。

在这种情况下,您无需添加&#39; / 0&#39;你的角色阵列。只需使用strncmp()函数并在第二个参数中指定要比较的字符数。

请参阅:http://www.tutorialspoint.com/c_standard_library/c_function_strncmp.htm

只是一个提示: 在您添加的每一段代码之后进行测试。这样很容易知道导致问题的代码。只有当你真正有经验(可能是4年多的编码)时,你才能勇敢地在测试之前编写更多代码。