2016-01-03 53 views
0

在假定的银行数据库中,我制作了一个50x7字符的指针数组(每个用户有50个用户,7条信息[字符串])。使用指针搜索特定字符串

我必须要求用户输入用户名(第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.\n\n"); 
       flagfinder = 1; 
       delmenu = 1; 
      } else 
      if (strcmp(delaction, "No") == 0) { 
      } 
     } 
    } 
    if (flagfinder == 0) { 
     printf("There is no %s in the database.\n", deluser); 
    } 
} 
+2

请格式化此代码,并且不要使用非标准的东西,比如'system(“cls”)'因为我们很多人都没有windows机器,所以很难测试你的代码。如果您没有发布“deluser”的声明/定义,则无法为您提供帮助。 –

+0

欢迎来到Stackoverflow。请花时间审查[如何提出一个好问题]的帮助(http://stackoverflow.com/help/how-to-ask)。具体而言,您提供的代码不完整。请提供代码的[最小完整和可验证示例](http://stackoverflow.com/help/mcve)。 – kaylum

+0

@iharob系统(“cls”)只是“清除”屏幕。添加了使用变量/指针的声明。 – mindonmoney

回答

1

重新格式化您的代码后,很明显,您没有编译正确的警告级别。编译器会发现这个错误:

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回路断线找到匹配。

+0

我的不好,这些都是草草写的。我纠正了这些。程序在执行你提到的命令之前仍然崩溃。 – mindonmoney