我正在尝试构建一个程序,该程序将从文件中获取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);
}
答案 0 :(得分:0)
@anthonygordon
很可能字符串usrname和userPassword没有以'\ 0'(空终止符)a)终止,因为scanf()可能会尝试填写比usrname可以捕获的更多字符b) for循环必须只迭代5次,以便userPassword [5]显式设置为'\ 0'。 (如果期望使用6个字符长的用户名和密码,那么将数组的长度从6更改为7并确保数组[6]填充'\ 0')(记住'C'数组下标为0 ..(ARRAYSIZE-1))
此外,一旦用户名和密码匹配,就会从循环中突破。
答案 1 :(得分:0)
您为用户名和密码字符数组选择了特定长度。这意味着您知道要比较的字符数量。
在这种情况下,您无需添加&#39; / 0&#39;你的角色阵列。只需使用strncmp()函数并在第二个参数中指定要比较的字符数。
请参阅:http://www.tutorialspoint.com/c_standard_library/c_function_strncmp.htm
只是一个提示: 在您添加的每一段代码之后进行测试。这样很容易知道导致问题的代码。只有当你真正有经验(可能是4年多的编码)时,你才能勇敢地在测试之前编写更多代码。