2016-10-18 4 views
-8

Dieser Code kehrt um und legt das Ergebnis in Datei, aber nicht vollständig richtig. Wie, einige Probleme mit der Erkennung von Leitungsunterbrecher oder etw. Hier ein Beispiel:Probleme mit der Umkehrung der Zeile in Datei

Quelle:

This is a line. 
This is another line. 
Quick brown fox jumps over a lazy dog! 

Ergebnis:

(blank line) 
.enil a si sihT 
.enil rehtona si sihT!god yzal a revo spmuj xof nworb kciuQ 
#include <stdio.h> 
#include <string.h> 
char *reverse (char *str) 
{ 
    char *begin, *end, c; 
    if (!str || !(*str)) 
     return NULL; 
    for (begin=str, end=str+strlen(str)-1; begin<end; begin++, end--) 
    { 
     c=*begin; 
     *begin=*end; 
     *end=c; 
    } 
    begin=str+strlen(str)+1; *begin='\0'; //?? 
    return str; 
} 
void main(void) 
{ 
    char line[1000]; 
    FILE *fsrc, *frslt; 
    fsrc=fopen("source.txt", "r"); 
    if (fsrc==NULL) return; 
    frslt=fopen("result.txt", "w"); 
    while (!feof(fsrc)) 
    { 
     fgets (line, 1000, fsrc); 
     fputs (reverse(line), frslt); 
    } 
    fclose(fsrc); 
    fclose(frslt); 
} 
+3

[Die feof in der while-Schleife ist falsch - lesen Sie] (http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong) –

+3

Der Code funktioniert gut, aber es wird die Zeilen zu gut umkehren. Was passiert, ist, dass der Zeilenumbruch ('\ n') ebenfalls umgekehrt ist, also wird der Zeilenumbruch am Anfang jeder Zeile platziert, aber" Der schnelle Braunfuchs ... "hat keine Zeile füttern am Ende, deshalb werden die Zeilen 2 und 3 zusammen geschmiert. Versuchen Sie, '\ n' als Ende der umzukehrenden Zeile zu verwenden. –

+0

Sie brauchen es nicht, da Sie in-Place arbeiten: 'begin = str + strlen (str) +1; * begin = '\ 0'; 'und du fügst zu viel hinzu (kein Problem, da der Puffer größer ist, aber immer noch ...) –

Antwort

3

Ein paar Kommentare/Nitpicks, die möglicherweise Ihr Problem nicht lösen :)

if (!str || !(*str)) 
    return NULL; 

Tun Sie das nicht. Bei leeren Strings wird NULL nicht zurückgegeben, fputs() wird barf. Nach meiner Erfahrung ist es besser, a) zu behaupten, dass der str-Zeiger nicht null ist, b) die leere Zeichenfolge zurückzugeben.

begin=str+strlen(str)+1; *begin='\0'; //?? 

Es sollte nicht notwendig sein, die Zeichenfolge zu beenden, da sie bereits beendet ist.

void main(void) 

Nein, main() gibt eine int zurück.

while (!feof(fsrc)) 

Dies wird nicht funktionieren. Sie müssen einige IO durchführen, bevor Sie für feof()/ferror() testen können. IMHO ist es besser, einfach auf fgets() zu loopen.

while (fgets(line, sizeof line, fsrc) { 
    ... 
} 

Es kann eine gute Idee sein, die Ein- und Ausgabedateien, fallen zu lassen und einfach von stdin und schreibt an stdout, zumindest während des Tests lesen. Die Funktionalität, die Sie implementieren möchten, ist bereits in einer UNIX-Shell (man rev) verfügbar. Die Verwendung von stdin/stdout erleichtert das Testen und Vergleichen der Ergebnisse mit den Ergebnissen von rev.

Beachten Sie auch, dass fgets() das \ n nicht aus der Zeichenfolge entfernt. Eingabe wie "foo \ n" wird "\ noof", was wahrscheinlich nicht das ist, was Sie wollen.

Hier ist ein Ausschnitt, der meine Kommentare im Code darstellt. Es löst nicht alle Probleme, aber sollte ausreichen, um Sie in Gang zu bringen.

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

void reverse(char *str) 
{ 
    char *begin, *end, c; 
    size_t n; 

    assert(str != NULL); 

    n = strlen(str); 
    if (n == 0) 
     return; 

    for (begin = str, end = str + n - 1; begin < end; begin++, end--) { 
     c = *begin; 
     *begin = *end; 
     *end = c; 
    } 
} 

int main(void) 
{ 
    char line[1000]; 

    while (fgets(line, sizeof line, stdin)) { 
     reverse(line); 
     fputs(line, stdout); 
    } 
} 

HTH

Verwandte Themen