【问题标题】:Comparing strings from files比较文件中的字符串
【发布时间】:2015-03-29 19:09:34
【问题描述】:

我有点问题。我希望程序搜索文件,如果它与用户的输入匹配,那么程序将显示“hello”,如果不匹配,它将显示“bye”。这些输出仅用于测试目的。回到问题。当它到达比较行时,程序崩溃。现在我对如何解决这个问题一无所知。我要求有人帮助我,并在此先感谢。下面是一个sn-p的代码:

int CaseFunc();
int CaseFunc(){ 
FILE *memFile;
char memberfname[28];
char memberlname[28];
char ffname[28];
char flname[28];
char code;
struct PersonalInfo array[1000];
int memberage;
int menuANS;
int members;
int i;
members = 0;

printf("Enter your answer here: ");
scanf(" %d", &menuANS);

switch (menuANS){
    case 1:
        system("cls");
        printf("Enter code: ");
        scanf(" %c", &code);
        do {
            printf("Enter First Name: ");
            scanf("%s", memberfname);
            printf("Enter Last Name: ");
            scanf("%s", memberlname);
            printf("Enter Age: ");
            scanf("%d", &memberage);

            if ((memFile = fopen("TheCarDepot Members.txt", "a+")) == NULL){    //If the file path is incorrect, an error message is displayed
                fprintf(stderr, "Error while opening file  (%d: %s)\n",errno, strerror(errno)); //Error message that will be displayed if file path is incorrect
            return;
        }

        fprintf (memFile, "%s %s %d", memberfname,  memberlname,    memberage); 
        fprintf (memFile, "\n");            
        fclose(memFile);
        printf("\n\n");
        printf ("*%s %s is now a member of TheCarDepot Team.*\n", memberfname, memberlname);

        printf("Enter code: ");
        scanf(" %c", &code);
    }
    while (code != 'x');
    break;

    case 2:
        if ((memFile = fopen("TheCarDepot Members.txt", "r")) == NULL){ //If the file path is incorrect, an error message is displayed
            fprintf(stderr, "Error while opening file  (%d: %s)\n",errno, strerror(errno)); //Error message that will be displayed if file path is incorrect
            return;
        }

        //while the file is opened and not at the end, the strings are stored into variables which forms an array of strings
        for (members = 0; members < 200; members++) {
           if (fscanf(memFile, "%s %s %d", memberfname, memberlname, &memberage) == 3)  //Reads the contents of the file
               break;
           array[members].fname = strdup(memberfname);
           array[members].lname = strdup(memberlname);
           array[members].age = memberage;
        }
        fclose(memFile);

        printf("Enter your first name: ");
        scanf("%s", ffname);
        printf("\n");

        if (strcmp(array[members].fname, ffname) == 0){
            printf ("hello");
        }
        else if (strcmp(array[members].fname, ffname) != 0){
            printf ("bye");
        }
        break;

【问题讨论】:

  • 哪个“比较线”?我看到多个比较事物的 if 语句。
  • @CareyGregory 使用 strcmp 的那一行

标签: c string file stdio


【解决方案1】:

退出for 循环时,members 可能等于 200,这是一个未初始化的数组条目。将其传递给strcmp 很容易导致崩溃。

另外,如果您因为fscanf 成功而提前退出循环,您的array 条目也会被初始化。再一次,这可能会导致崩溃。

您需要在退出循环之前初始化 array 条目,并且在访问该数组条目之前,您需要检查以确保 members 小于 200。

【讨论】:

    【解决方案2】:
    for (members = 0; members < 200; members++) {
               if (fscanf(memFile, "%s %s %d", memberfname, memberlname, &memberage) == 3)  //Reads the contents of the file
               break; //exit the loop if the reading is successful, the following lines are never executed
               array[members].fname = strdup(memberfname);
               array[members].lname = strdup(memberlname);
               array[members].age = memberage;
    }
    

    基本上,您是手动退出循环,并且永远不会将值输入到结构中,因此指针无效。

    还有内存泄漏,fnamelname 应该被释放。

    【讨论】:

    • 释放是什么意思
    • @Kkkkkkkkkkkkk 类似free(array[i].fname); free(array[i].lname);
    • 我应该把那个放在哪里?将其存储到变量中之后?
    • @Kkkkkkkkkkkkk 每当您不再需要这些变量时,或者您可以更改结构的定义以使用char 数组而不是指针并使用strcpy 而不是strdup
    【解决方案3】:

    您必须验证您的 array[members].fname,如果它是 NULL,或者它不包含字符串结尾字符,那么它可能会崩溃。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多