2017-12-27 24 views
0

Ich bin ziemlich neu in C und übe derzeit, indem ich ein Programm schreibe, mit dem Benutzer nach Hashes suchen können, die in einer Textdatei geschrieben sind. Ich habe mit dem folgenden Programm kommen:Übereinstimmende Hashes in C

HashMatch.c

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

//Declaring Functions 
int searchstringinfile(char *string, char *filename); 
void UsageInfo(char *filename); 

//Display usage info on arguements for program 
void UsageInfo(char *filename) { 
    printf("Usage: %s <file> <string>\n", filename); 

} 

int searchstringinfile(char *filename, char *string) { 
    //Define File 
    FILE *userfile; 

    int linenumber = 1; 
    int search_result = 0; 
    char temp[10000]; 

    //Error handling for invalid file 
    if((userfile = fopen(filename, "r")) == NULL) { 
     return(-1); 
    } 


    //Matching words line-by-line 
    while(fgets(temp, 10000, userfile) != NULL) { 
     if((strstr(temp, string)) != NULL) { 
     //Display line in which matched word is found 
      printf("A match found on line: %d\n", linenumber); 
      printf("\n%s\n", temp); 
      search_result++; 
    } 
    linenumber++; 
} 


    // Display message if no matches are found 
    if(search_result == 0) { 
     printf("\nSorry, couldn't find a match.\n"); 
    } 

    //Closes the file. 
    if(userfile) { 
     fclose(userfile); 
    } 
    return(0); 
} 


//main function. 
int main(int argc, char *argv[]) { 
    int result, errcode; 
    //Display format for user to enter arguements and 
    //End program if user does not enter exactly 3 arguements 
    if(argc < 3 || argc > 3) { 
     UsageInfo(argv[0]); 
     exit(1); 
} 


    system("cls"); 
//Pass command line arguements into searchstringinfile 
    result = searchstringinfile(argv[1], argv[2]); 
//Display error message 
     if(result == -1) { 
      perror("Error"); 
      printf("Error number = %d\n", errcode); 
      exit(1); 
    } 
    return(0); 
} 

Ich habe auch mit einer Datei, die eine Zeichenfolge kommen und eine hash:

Hashtext.txt

$1$$t8TX0OHN6Wsx6vlPZNKik1 
Ice-Cream 
I SCREAM FOR Ice-Cream ! 

Wenn ich nach dem Wort Ice-Cream als solches suchen würde:

./test hashtext Ice-Cream 

Ich bin in der Lage Zeilen mit dem Wort zu finden:

A match found on line: 2 

Ice-Cream 

A match found on line: 3 

I SCREAM FOR Ice-Cream ! 

Allerdings, wenn ich für die Hash im Text suchen war, ich bin nicht in der Lage, dies zu tun. Kann mir jemand erklären, warum ich nicht in der Lage bin, nach dem Hash zu suchen und mich durch die Schritte zu führen, damit ich das tun kann?

Vielen Dank.

+0

vielleicht Hash nicht auftritt? – coderredoc

+0

Das Problem scheint auf dem Weg zu sein, wie Sie Ihr Programm mit dem Hash aufrufen. Versuchen Sie, den eingegebenen Suchbegriff zu drucken, um ihn zu überprüfen. –

+1

Sie müssen $ entkommen, wenn es Teil Ihrer Befehlszeilenargumente ist – Pras

Antwort

0

Ihre Hash-String hat ' $ ist drin. Bash hält es für einen besonderen Charakter. Sonderzeichen müssen maskiert werden, um die spezielle Bedeutung dieser Zeichen zu entfernen.

Je nach Situation können Sie eine der folgenden tun, um sie zu behandeln:

  1. Flucht die Sonderzeichen einzeln \ verwenden. Ihre Eingabezeichenfolge würde wie \$1\$\$t8TX0OHN6Wsx6vlPZNKik1 aussehen.
  2. Die Sonderzeichen aus der gesamten Zeichenfolge mit ' umgehen. Ihre Eingabezeichenfolge würde wie '$1$$t8TX0OHN6Wsx6vlPZNKik1' aussehen.
  3. Laden Sie die Zeichenfolge von stdin durch Umleitung. Sie müssen dafür jedoch Ihr Programm bearbeiten. Du musst den Charakteren nicht entkommen.

Hier ist die umfassende Liste von vielen Sonderzeichen in bash: https://docstore.mik.ua/orelly/unix/upt/ch08_19.htm

0

Von Kommentare, die Sie scheinen Ihre Befehlszeilen haben $ zustimmen, brauchen Sie nicht es in Code zu handhaben, sondern während es von Shell vorbei Sie brauchen, um sie zu entkommen mag:

./test hashtext \$1\$\$t8TX0OHN6Wsx6vlPZNKik1 
+0

Awesome! Vielen Dank. Ich werde einen Weg finden, den Backslash zu jedem Vorkommen von '$' hinzuzufügen :) – catmix