Результат сравнения пустой строки в C - PullRequest
0 голосов
/ 06 октября 2019

У меня есть два массива символов в программе на Си:

char stored_pass[15] = "steveone"
char pass[15] = "\0" 

При запуске strcmp(stored_password, pass) для сравнения двух я получаю результат, что они равны (== 0).

Я не очень понимаю, почему это так.

Может кто-нибудь объяснить мне? Я посмотрел разницу между пустой строкой и строкой с нулевым символом в конце, но на самом деле не нашел ответа.

Похоже, проблема в методе authenticate.

Исходный код всей программы на C:

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

// Execute any shell command
void execute(char *cmd)
{
   execl("/bin/bash", "bash", "-p", "-c", cmd, NULL);
}

void sanitise(char *password)
{
  int i,j;
  char tmp[15];

  // remove non-alphabet  characters from passwords
  j=0;
  for(i=0; i < 15; ++i) 
    if(password[i] >= 'a' && password[i] <= 'z') {
      tmp[j]=password[i];
      ++j;
    } else break;
  tmp[j] = '\0';

  strcpy(password, tmp);

}

int authenticate(char *str)
{
  char stored_password[15]="";
  char pass[15];
  char path[128] = "/etc/computer/Steve/password";
  int i;

  FILE *fpp; 
  int auth=0;

  fpp = fopen(path, "r");

  if(fpp == NULL)
  {
     printf("Password file %s not found\n", path);
     exit(1);
  }

  fgets(stored_password, 15, fpp);
  sanitise(stored_password);

  strcpy(pass, str);
  sanitise(pass);

  if(strcmp(stored_password,pass) == 0)
     auth=1;
  else {
     auth=0;
  }

  fclose(fpp);

  return auth; 
}

int main(int argc, char* argv[], char *envp[])
{
  if(argc < 2) 
  {
    printf("Usage: %s password\n", argv[0]);
    return 0; 
  }


  if(!authenticate(argv[1])) {
    // Log all failed attempts
    printf("Wrong password. This incident has been logged.\n");
    execute("/home/Steve/Public/error.sh"); 
    return 0;
  }

  execute("cat /etc/computer/Steve/secret");

  return 0;
}

1 Ответ

0 голосов
/ 07 октября 2019

Прежде всего, ваша функция sanitize помещает '\ 0', тем самым завершая строку, когда в первый раз находит не алфавитное значение char. Вы уверены, что это именно то, что вы хотите? (Может быть, вы хотели использовать продолжить; вместо прерывания; в цикле for?) Если и пароль в файле, и пароль, введенный пользователем, начинаются с цифры, обе сравниваемые строки будутравно "\ 0". Как уже говорилось, попробуйте распечатать обе строки перед вызовом strcmp ().

...