2017-12-09 14 views
0

Ich versuche ein Programm zu erstellen, das eine Reihe von Buchstaben aus einer Datei entschlüsselt. Leider kann ich die Buchstaben nicht in ein Char-Array (String) lesen, weil ich nicht weiß, wie die fgets() -Funktion funktioniert. So sieht meine eigentliche Code wie folgt aus:Eine Zeichenkette mit fgets aus einem Filestream in ein char-Array lesen. [C]

#define stringlength 80 

int main(void) 
{ 
    FILE *source; 
    char puffer[stringlength], name[20]; 

    printf("Which file do you want to read: "); 
    scanf("%s",name); 
    if((source=fopen(name,"r")) == NULL) 
    { 
     fprintf(stderr, "Can not open %s\n", name); 
     return EXIT_FAILURE; 
    } 
    while(fgets(puffer, stringlength, source)) 
    { 
    fputs(puffer, stdout); 
    } 
    return EXIT_SUCCESS; 
} 

Also eigentlich das irgendwie funktioniert. Es öffnet die Eingabeaufforderung und schreibt die Buchstabenfolge in dieses Fenster. Aber jetzt muss ich jeden einzelnen Buchstaben benutzen und ihn mit den Buchstaben des Schlüssels vergleichen. Es vergleicht nur die rechten vier Bits mit einem XOR, um den Ergebnisbuchstaben in der gleichen Spalte des ASCII-Diagramms zu halten. Ich habe bereits einen Algorithmus geschrieben, die für einzelne Buchstaben funktioniert:

saveLeftFourBits = letterOfFile >> 4; 
saveLeftFourBits = saveLeftFourBits << 4; 
letterOfFile = letterOfFile & 0x0F; 
letterOfKey = letterOfKey & 0x0F; 
temp = letterOfFile^letterOfKey; 
temp |= saveLeftFourBits; 

Temp die resultierende Brief sein sollte. So jetzt kämpfe ich mit, wie man einen einzelnen Buchstaben von der fgets Funktion in eine Variable (in letterOfFile) liest und es mit dem letterOfKey vergleicht. Oder gibt es vielleicht eine String-Funktion, die das viel einfacher macht? Ich hoffe, dass mir jemand helfen kann. :)

Antwort

1

puffer ist, wo fgets Speicher eine Linie von 80 Zeichen max, einschließlich (falls Größe zulässt) das Nachlauf \n.

mit allen Zeichen einer Zeile umgehen, führen Sie eine Schleife von Anfang an von puffer bis Sie das Ende der Linie erreichen, entweder \0 oder \n

char letterOfKey = '#';  // Define it 
char *s; 
for(s=puffer ; *s && *s != '\n' ; s++) { 
    *s = (*s & 0xF0) | ((*s^letterOfKey) & 0x0F); 
} 
fputs(puffer, stdout); 

Erklärung

s Punkte zu Beginn der puffer Bedeutung und wird inkrementiert. Die Schleife endet, wenn der Buchstabe s entweder 0 oder \n ist. Für jedes Zeichen in der Zeile *s werden bitweise Operationen ausgeführt und zurück auf *s gespeichert.Und

  • (*s & 0xF0) hält die 4 MSb
  • | ist das bitweise OR
  • (*s^letterOfKey) hat ein Exklusiv-ODER zwischen den zwei Operanden
  • & 0x0F hält die 4 LSb

Siehe auch Bitwise operations in C

+0

Wow, danke. Funktioniert perfekt. – Nord

0

Das Programm ist in Ordnung. Aber das Verschieben und Maskieren sieht mir verdächtig. Ich denke, du bist auf die allgemeine Verwirrung zwischen Binär und Hex gefallen. Binärzahlen sind das Format, in dem Ganzzahlen nativ dargestellt werden und die bitweisen Operatoren nur sinnvoll sind. Hex-Zahlen sind ASCII-Zeichenfolgen wie "F2E0", das erste Zeichen ist "F", wie in "Fred" und muss als Text behandelt werden. Sie können eine kleine Funktion schreiben, um ein Zeichen zu nehmen und eine Zahl von 0-15, oder -1 bei einem Fehler (bestanden einen Buchstaben wie "K", die keinen Hex-Wert hat).

So wie diese

int hextobinary(char hex) 
{ 
    /* logic here */ 
} 

int hexstringtobinary(char *hexstr) 
{ 
    int i; 
    int answer = 0; 
    for(i=0;hextr[i] != '\0';i+++) 
    { 
     answer *= 16; 
     answer += hextobinary(hexstr[i]); 
    } 
    return answer; 
} 

Als Übung in die Fehlerbehandlung setzen, wenn eine Zeichenfolge mit nicht-hex-Zeichen in sie übergeben.

Verwandte Themen