Сравнение строки из текстового файла в C - PullRequest
0 голосов
/ 22 сентября 2019

Я хочу сравнить строку ввода пользователя и строку из текстового файла.

Я сравниваю значение uname и текущее значение хранилища.Он идет внутри цикла while, но когда они совпадают, он не переходит к блоку if, который должен выполнять тест, если для storage и uname имеют одинаковое значение.

void compare()
{
   char uname[20];
   FILE *list = fopen("list.txt","a");

   if(list == NULL)
   {
      printf("Textfile doesn't have any content\n");
   }

   printf("Enter username: ");
   scanf("%s",&uname);
   fprintf(list,"%s\n",uname);
   fclose(list);

   list = fopen("listahan.txt","r");

   char storage[50]; //storage of the string that I will get from the textfile

   if(list != NULL) //check if list have content
   {
       while((fgets(storage,sizeof(storage),list) != NULL)) //if list have content, get it line by line and compare it to the uname.
       {
          printf("storage:%s\n",storage); // for debug, checks the current value of storage
          printf("uname:%s\n",uname); //for debug, checks the value of uname

          if(storage == uname) //this if block is being ignored, even when the storage and uname match, the block does not execute.
          {
             printf("Login Success!\n");
          }
    }
}

Ответы [ 2 ]

1 голос
/ 22 сентября 2019

При вводе массива символов вам не нужно указывать &uname, Почему для scanf не нужен амперсанд для строк, а также отлично работает в printf (на C)?

Исправьте это так:

scanf("%s",uname);

Остальные исправления:

if(list != NULL) //check if list have content
{
    while(fgets(storage,sizeof(storage),list) != NULL) //if list have content, get it line by line and compare it to the uname.
    {
        if (*storage == '\n') 
            continue;
        sscanf(storage, "%[^\n]", storage);
        printf("storage:%s\n",storage); // for debug, checks the current value of storage
        printf("uname:%s\n",uname); //for debug, checks the value of uname

        if(!strcmp(storage, uname)) //this if block is being ignored, even when the storage and uname match, the block does not execute.
        {
            printf("Login Success!\n");
        }
    }
}

Кроме того, вы можете просто использовать fscanf() вместо fgets, но это довольно плохая идея, прочитайтепервый ответ в Проблемы с чтением строки с использованием fscanf ()

Итак, сначала вы fgets() сохраните значение в storage.

Как указано в manpage :

fgets () считывает из потока не более одного размера символа и сохраняет их в буфере, указанномs.Чтение останавливается после EOF или новой строки.Если читается новая строка, она сохраняется в буфере.Завершающий нулевой байт (aq \ 0aq) сохраняется после последнего символа в буфере.

При кратком чтении остановится, если встретится новая строка, но он также будет сохранен.

Итак "username" != "username\n".Вот почему мы sscanf() снова переводим строку в ту же строку для чтения только до \n.

Также для сравнения массивов символов необходимо использовать strcmp().== будет работать, если вы сравниваете char *.

0 голосов
/ 22 сентября 2019

Вы сравниваете адрес массива хранения с адресом массива uname. Это всегда false.Вы должны использовать strcmp (storage, uname) для сравнения строк обоих массивов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...