2016-07-23 4 views
-1

Der folgende Code kompiliert mit keinen Fehler oder Warnungen, ich kann auch das Programm ausführen und es wird erwartet, dass es die Fehlermeldungen an den erwarteten Stellen, z. B. die Bereitstellung von Argumenten zurückgegeben wird zu nicht vorhandenen Dateien. vomdebug mit keine Fehler oder Warnungen

register int ch, i; 

Down to

return (1); 

vor Auf diese Weise kann kenne ich den Code funktioniert so weit wie Linie 28 (in der Nähe des! fpc Abschnitts)

es Bedeutung muss ein Problem sein,

printf("\"%s\"\n",line);\ 

Das Programm wird erwartet, Befehlszeilenargumente des Programmnamens selbst und zwei Dateinamen zu übernehmen s, öffnet es dann beide Dateien und sollte dann Zeichenfolgen aus der ersten Datei bis zu einer maximalen Länge in die zweite Datei kopieren, während " am Anfang und am Ende der Zeichenfolge in der neuen Datei hinzugefügt wird.

Der Code, den ich habe, ist

fgetline.c

#include "fgetline.h" 

int main(int argc, char *argv[]) { 

    if (argc != 3) { 
     printf("usage: enquote filetocopy filetowrite \n"); 
     exit(1); 
    } 

    fp = fopen(argv[1], "r"); 
    if (!fp) { 
     printf("Couldn't open copy file: (%d) %s\n", errno, strerror(errno)); 
     return -1; 
    } 

    fpc = fopen(argv[2], "r+"); 
    if (!fpc) { 
     printf("Couldn't open write file: (%d) %s\n", errno, strerror(errno)); 
     return -1; 
    } 

    register int ch, i; 

    ch = getc(fp); 
    if (ch == EOF) 
     return -1; 

    i = 0; 
    while (ch != '\n' && ch != EOF && i < max) { 
     line[i++] = ch; 
     ch = getc(fp); 
    } 
    line[i] = '\0'; 

    while (ch != '\n' && ch != EOF) { 
     ch = getc(fp); 
     i++; 
    } 
    return(i); 

    printf("\"%s\"\n",line); 

    fclose(fp); 
    fclose(fpc); 
    return 0; 
} 

fgetline.h

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

int fgetline(FILE *fp, char *line, int max); 
FILE *fp, *fpc; 
#define max 30 
char line[max + 1]; 

Ich Kompilieren mit

debian:~/uni/Ass0$ gcc fgetline.c -Wall -o enquote 
debian:~/uni/Ass0$ cd/
1.363.210

Tests ich tat, war

debian:~/uni/Ass0$ ./enquote 
usage: enquote filetocopy filetowrite 
debian:~/uni/Ass0$ ./enquote test 
usage: enquote filetocopy filetowrite 
debian:~/uni/Ass0$ ./enquote test frog 
Couldn't open write file: (2) No such file or directory 
debian:~/uni/Ass0$ ./enquote monkey frog 
Couldn't open copy file: (2) No such file or directory 
debian:~/uni/Ass0$ cat test 
ting 
test 
123 

[email protected]:~/uni/Ass0$ cat test2 
[email protected]:~/uni/Ass0$ ./enquote test test2 
[email protected]:~/uni/Ass0$ cat test2 

erwartete Ergebnis wäre, wenn ich ./enquote Test test2 laufen, kopieren würde

ting 
test 
123 

test-test2 so wäre es wie

erscheinen
"ting" 
"test" 
"123" 

Danke, nicht sicher, wie viel mehr Informationen zu geben.

+3

1) Aktivieren ** alle ** Warnungen! '-Wall' ist weit weg von" allen "2) Keine Fehler/Warnungen garantieren keinen korrekten Code. 3) Formatiere deinen Code neu. GNU-Stil ist soo sehr 80ies. – Olaf

+0

@Olaf, was sind die Flaggen für alle Warnungen, schnelle Suche aufgetaucht -Wextra was sonst, ok mit Wextra versucht, immer noch kein Glück. – Ausghostdog

+0

@Ausghostdog Mein derzeitiges Set ist 'gcc -pedantisch -Wand -Wextra -Web-Funktions-Cast -Wcast-Align -Winding-Optimierung -Wendif-Labels -Winline -Missing-Prototypen -Wensted-Externs -WashowD -Werstrict-Prototypen- Wundef -Write-Strings -Wformat = 2 -Wnull-Dereferenz -Winit-self -Whift-negativer Wert -Whift-overflow = 2 -Wduplicated-cond -O2'. – melpomene

Antwort

3

Es gibt viele Probleme mit Ihrem Code, aktiviert mit allen Warnungen kompilieren einige von ihnen entdeckt haben würde:

  • Deklarieren von globalen Variablen in einer Header-Datei ist eine gute Praxis, aber nicht, sie dort zu definieren. Das Schlüsselwort extern wird für Deklarationen verwendet. Die Definitionen gehören in die C-Datei. In diesem Fall sollten Variablen wie fp, fp1, line als lokale Variablen und nicht als globale Variablen definiert werden.
  • Die Ausgabedatei argv[2] sollte mit dem Modus "w" geöffnet sein, "r+" wird für den aktualisierten Modus verwendet und schlägt fehl, wenn die Datei nicht existiert. Update-Modus ist sehr schwierig und verwirrend, vermeiden Sie es zu verwenden.
  • Verwenden Sie nicht das register Schlüsselwort, es ist jetzt veraltet, da Compiler intelligent genug sind, um zu bestimmen, wie Register am besten zu verwenden sind.
  • Ihre while Schleifen werden nur 2 Zeilen aus der Eingabedatei lesen, speichert die erste in die line-Array und verwerfen die zweite.
  • Die Anweisung return (i); verlässt das Programm, es wird keine Ausgabe ausgeführt, die restlichen Anweisungen in der Funktion werden vollständig ignoriert (-Wall könnte diesen Fehler entdeckt haben).

Sie können das Problem vereinfachen, indem diese unter Berücksichtigung: Sie wollen ein " am Anfang jeder Zeile und vor den '\n' am Ende jeder Zeile ausgegeben wird. Sie müssen die Zeile im Speicher nicht puffern, wodurch die Zeilenlänge begrenzt wird. Nur Ausgabe der ", wenn Sie eine Zeile beginnen und bevor Sie ein Ende:

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

int main(int argc, char *argv[]) { 
    FILE *fp, *fpc; 
    int ch, last; 

    if (argc != 3) { 
     printf("usage: enquote filetocopy filetowrite\n"); 
     exit(1); 
    } 

    fp = fopen(argv[1], "r"); 
    if (!fp) { 
     fprintf(stderr, "Could not open input file: (%d) %s\n", 
       errno, strerror(errno)); 
     return 2; 
    } 

    fpc = fopen(argv[2], "w"); 
    if (!fpc) { 
     fprintf(stderr, "Could not open output file: (%d) %s\n", 
       errno, strerror(errno)); 
     return 2; 
    } 

    last = '\n'; // we are at the beginning of a line 
    while ((ch = fgetc(fp)) != EOF) { 
     if (last == '\n') { 
      fputc('"', fpc); // " at the beginning of a line 
     } 
     if (ch == '\n') { 
      fputc('"', fpc); // " at the end of a line 
     } 
     fputc(ch, fpc); 
     last = ch; 
    } 
    if (last != '\n') { 
     // special case: file does not end with a \n 
     fputc('"', fpc); // " at the end of a line 
     fputc('\n', fpc); // put a \n at the end of the output file 
    } 

    fclose(fp); 
    fclose(fpc); 
    return 0; 
} 
+0

Vielen Dank und auch für die Erklärung. Scheint so, als hätte ich einen sehr langen Weg, um weiterzugehen. – Ausghostdog

+1

@Ausghostdog: Es braucht eine Menge Arbeit, um C beherrschen zu lernen, aber die Fähigkeiten, die Sie erwerben werden, werden für eine Vielzahl von anderen nachsichtigeren Sprachen nützlich sein. Weiter studieren, es lohnt sich! – chqrlie

Verwandte Themen