在一个假定的银行数据库中,我制作了一个50x7字符的指针数组(50个用户,每个用户有7条信息[strings])。
我必须要求用户输入用户名(第5列包含所有50个用户名),以便程序在该数组中找到它,并删除与该用户相关的所有信息(将该行的所有列替换为0)。
每当我输入用户名并按Enter键让程序搜索并"擦除"时,它就会立即崩溃。
我是个编程高手,所以尽量简单。(没有自动功能)每个变量和指针都正确启动。
下面是困扰我的具体部分。谢谢你的时间。我花了一整天的时间试图掌握这一点。
char* users[50][7];
char deluser[50], delaction[50]; //Delete Existing User
int flagfinder, delmenu, flagresearch=0; //Delete Existing User
while (delmenu == 0) {
flagfinder = 0;
printf("Type the username of the customer you want to erase off of the database:n");
scanf("%s", deluser);
for (x = 0; x < 50; x++) {
y = 1;
while (flagresearch == 0 || y < 50) {
if (deluser[y] != *(users[x][5] + y)) {
flagresearch = 1;
}
y++;
}
if (flagresearch == 0) {
printf("Are you sure you want to delete %s's info?(Yes/No)n", deluser);
scanf("%s", delaction);
while (strcmp(delaction, "Yes") != 0 && strcmp(delaction, "No") != 0) {
printf("Try again.Are you sure you want to delete %s's info?(Yes/No)n", deluser);
}
if (strcmp(delaction, "Yes") == 0) {
for (y = 0; y < 7; y++) {
*users[x][y] = 0;
}
printf("n%s's data has been erased from the mainframe.nn");
flagfinder = 1;
delmenu = 1;
} else
if (strcmp(delaction, "No") == 0) {
}
}
}
if (flagfinder == 0) {
printf("There is no %s in the database.n", deluser);
}
}
重新格式化代码后,很明显您没有使用正确的警告级别进行编译。编译器会发现这个错误:
if (flagfinder = 0) {
这条线也不太可能达到你的预期:
while (flagresearch == 0, y < 50)
比较用户名的代码看起来错误:
while (flagresearch == 0 || y < 50) {
if (deluser[y] != *(users[x][5] + y)) {
flagresearch = 1;
}
y++;
}
这将始终比较50
字节,包括fscanf
未初始化的字节。只有当users[x][5]
指向的字符串正好是49个字节和一个NUL字节时,它才能工作。我怀疑您正在读取超出数组末尾的内容,或者可能正在取消引用NULL
指针。是否确定已分配所有数据库字符串?
你可以用这个来代替:
flagresearch = (users[x][5] == NULL) || strcmp(users[x][5], deluser);
请注意,除非多个用户可以具有相同的名称,否则使用单个正标志(如flagfound
)并在找到匹配项时从for
循环中断会更直观。