Сравните строковую ошибку на языке C с помощью File IO и 2Darray

Моя программа используется для удаления записи в файле данных. Я попрошу пользователя ввести «номер записи», который он хочет удалить. Однако, когда я использую эту функцию strcmp для сравнения двух строк, она не работает.

Проблема: невозможно с помощью strcmp удалить определенную запись и поместить обновленные данные в новый файл

Вот мой код:

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

int main(){
    Del_menu();
    return 0;
}

// function1
int Del_menu() {
    while (1) {
          printf("Please enter a record number you wanted to delete : ");
          Del();
          printf("\nDo u want to delete  other record? Enter 'y' for yes and 
          'n' for no :");
          char ans;
          scanf(" %c", &ans);
          if (ans == 'N' || ans == 'n') {
          break;
          }
    }
}

//function2
int Del(){

        FILE *sfr = fopen("stock.txt", "r"); 
        //just for me getting total number,you can igone this
        char *str;
        int total;
        total=0;
    while (!feof(sfr)){
        str = fgetc(sfr);
        if(str == '\n') {
        total++;
        }
    }
        total = (total/9);
        fclose(sfr);

        FILE *fileptr1, *fileptr2;
        char filename[40] = "data.txt";
        int total = 0;  
        int  total_1 = 0 ,total_2 = 0, i = 0 , temp;

   char itemrecord [40][40];
   char quantity [40][40];
   char weight [40][40];
   char itemname [40][40];
   char catagory [40][40];
   char recipient [40][40];
   char final_destination [40][40];
   char status [40][40];

        fseek(stdin, 0, SEEK_END);
        fflush(stdin);

        i++;
        total--;
        }

        FILE *fileptr1, *fileptr2;
        char filename[40]="stock.txt";

        fileptr1 = fopen(filename, "r");

        char buffer [50];
    while(total_1!=0){

  fgets(recordnum[i],50,fileptr1);
  fgets(itemname[i],50,fileptr1);
  fgets(itemrecord[i],50,fileptr1);
  fgets(catagory[i],50,fileptr1);
  fgets(quantity[i],50,fileptr1);
  fgets(weight[i],50,fileptr1);
  fgets(recipient[i],50,fileptr1);
  fgets(final_destination[i],50,fileptr1);
  fgets(status[i],50,fileptr1);
  fgets(buffer, 50,fileptr1);
        fclose(fileptr1);
        fclose(fileptr2);
        i++;
        total_1--;
  }

        char del_data[41]; //get user input
        fgets(del_data,50,stdin);
        del_data[strlen(del_data) - 1] = '\0';
        printf("\nyou have entered :%s\n", del_data);

        printf("\nRecord in file before delete:\n");
        printf("Total record: %d\n",total);

        i=0;
    while(total_2!=0){

       printf("%s%s%s%s%s%s%s%s%s\n",recordnum[i],itemrecord[i],quantity[i],
       weight[i],itemname[i], catagory[i],recipient[i],
       final_destination[i],status[i]);
       i++;
       total_2--;
    }

       rewind(fileptr1);

       fseek(stdin, 0, SEEK_END);
       fileptr2 = fopen("copy.c", "w");  //stored the data after deleted
       total_3=total_3 -1;

       i=0; 
    while(total!=0){

       if ( strcmp(recordnum[i],del_data) != 0){
       printf("%s",recordnum[i]); //for me checking is it successful              

       fprintf(fileptr2,"%s%s%s%s%s%s%s%s%s\n",recordnum[i],itemrecord[i],
       quantity[i],weight[i],itemname[i], catagory[i],recipient[i],
       final_destination[i],status[i]);

       i++; total--;}
            }


remove(filename);
// rename the file copy.c to original name
rename("copy.c", filename);
} // end of function 2

Результат:

Please enter a record runber you want to delete: 1001

You enterd: 1001

Record in file before deleted:
Total:3
1001
Orange Laptop Computer DX5
235524
Electronics
1
1.8 kg
Chan 
Mong Kok
Delivery

1002
Japanese Garden Pear Gift Box
300522
Food
2
4.2 kg
Cheung 
Yuen Long
Arrival

1003
Koppo Badminton Racket GPX-15
77524
Fashion
3
0.6 kg
Lee Siu Yu
Fortress Hill
Warehouse

1001 // not exist after i finish this code
1002 // just for I debugging now
1003 // here is my problem* mean that cannot delete record successful

DO you want to delete other record?Enter'y' for yes, 'n' for no: n

person Hang Wui    schedule 29.11.2018    source источник
comment
Затем одна проблема, которая может быть связана: вы читаете до 50 символов (включая терминатор) в массивы из 40 символов.   -  person Some programmer dude    schedule 29.11.2018
comment
Где ваш вклад?   -  person Swordfish    schedule 29.11.2018
comment
Кроме того, stdin, вероятно, не доступен для поиска, поэтому ваш fseek(), вероятно, дает сбой (вы не проверяете это). Я не уверен, что вы намеревались это сделать.   -  person John Bollinger    schedule 29.11.2018
comment
О, и str — это указатель на char. Функция fgetc возвращает один символ в виде int. Вы также сравниваете этот указатель с константным символьным литералом. Компилятор должен выдавать вам предупреждения за это, а если нет, вам нужно включить больше предупреждений и рассматривать их как ошибки.   -  person Some programmer dude    schedule 29.11.2018
comment
@Swordfish, ты видишь мой код char del_data[41]; //get user input   -  person Hang Wui    schedule 29.11.2018
comment
@HangWui У вас много ненужного кода и неправильный отступ.   -  person kiran Biradar    schedule 29.11.2018
comment
Наконец, ваш код, как вы его сейчас показываете, даже не должен компилироваться! Большая часть вашего кода находится вне какой-либо функции. Вы действительно пытались построить то, что показываете? Возможно, вам стоит попытаться создать минимально воспроизводимый пример, чтобы показать нам?   -  person Some programmer dude    schedule 29.11.2018
comment
мой fseek() используется для очистки буфера, однако я забыл удалить fflush(stdin).   -  person Hang Wui    schedule 29.11.2018
comment
fseek() не более вероятно повлияет на stdin, чем fflush(). На самом деле это менее вероятно. Если вы хотите очистить ожидающий ввод, то единственный стандартный способ сделать это — прочитать его.   -  person John Bollinger    schedule 29.11.2018
comment
хорошо, спасибо всем за полезные комментарии. Я пытаюсь улучшить свою программу   -  person Hang Wui    schedule 29.11.2018
comment
Вы даже не устранили все проблемы, на которые мы указали в последний раз. Вам специально сказали не fflush(stdin) stackoverflow.com/questions/53448384/   -  person torstenvl    schedule 29.11.2018
comment
@torstenvl мне очень жаль, поэтому я использую fseek() вместо fflush() и забыл удалить fflush   -  person Hang Wui    schedule 29.11.2018
comment
В любом случае, спасибо за все ваши содержательные ответы, чтобы улучшить мой глупый код -   -  person Hang Wui    schedule 29.11.2018
comment
Swordfish u можете увидеть мой код char del_data[41]; //get user input – А теперь я должен угадать, что ввел $user? Спасибо.   -  person Swordfish    schedule 29.11.2018


Ответы (1)


Когда вы читаете выбор пользователя, вы тщательно удаляете завершающую новую строку, которую fgets() сохраняет в буфере, но вы не применяете ту же обработку к данным, которые вы читаете в своем массиве. Кажется, что в вашем файле каждое поле находится в отдельной строке, поэтому в данных, которые вы читаете в свой массив, действительно есть новые строки. Таким образом, сравнение не удается, потому что строки действительно разные.

Самым простым решением было бы перестать удалять завершающую новую строку из пользовательского ввода. Есть много других проблем с этим кодом, но внесение этого изменения должно, по крайней мере, заставить его работать в том отношении, о котором вы спрашивали.

person John Bollinger    schedule 29.11.2018