2016-11-04 3 views
0

Ich versuche ein Programm zu erstellen, das Befehle vom Ubuntu-Terminal entgegennimmt und gleichzeitig eine Datei einliest. Die Befehle wären, wenn der Benutzer "-c" eingibt, liest er die Datei und druckt die Zeichenanzahl, wenn der Benutzer "-w" eingibt, druckt er die Wortzählung aus der gelesenen Datei, "-l", um die Anzahl der Zeilenumbrüche zu drucken Figuren. Jedenfalls habe ich versucht, dies mit fscanf für die Anzahl der Zeichen zu tun, aber es scheint aus irgendeinem Grund nicht zu funktionieren. Kann mir jemand erklären, was ich falsch mache oder ob es bessere Möglichkeiten gibt, dies zu tun? C Befehlsargumente für Sprache + Lesen in Datei

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


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

int i; 
char words[1000]; 
int counter = 0; 
for(i = 0; i < argc; i++){ 
    if(strncmp(argv[i], "-c", 2) == 0){ 
    if(argv[i + 1] != NULL){ 
     while((fscanf(argv[i + 1], "[^\n]%s", words[i])) != EOF){ 
      counter++; 
     } 
    printf("%d characters\n", counter); 
    } 
    printf("print character count\n"); 
    } 
    else if(strncmp(argv[i], "-w", 2) == 0){ 
    printf("print word counts\n"); 
    } 
    else if(strncmp(argv[i], "-l", 2) == 0){ 
    printf("print newline counts\n"); 
    } 
    else if(strncmp(argv[i], "-h", 2) == 0){ 
    printf("prints help\n"); 
    } 
} 

} 
+0

es ist 'sscanf' nicht' fscanf' aus einer Zeichenkette zu lesen. –

+0

Sie können die getopt-Bibliothek auch verwenden, um Befehlszeilenargumente zu analysieren. –

Antwort

2
  • Der erste Parameter ist ein offener fscanf Strom, kein Dateiname. Sie müssen den Dateinamen an übergeben, um einen Stream zu erhalten.

  • Die Art, wie Sie versuchen, fscanf zu verwenden, ist sehr unsicher, so schlecht wie gets, weil es Ihren Fixed-Size-Puffer problemlos überlaufen kann. fgets, die die Puffergröße als Parameter nimmt, wäre viel besser.

  • Ihre fscanf Formatzeichenfolge ist falsch. Wenn Sie einen Zeichensatz übergeben, geht der Klammerwert nach dem % nicht davor, und Sie verwenden kein s zusätzlich. Aber dieses Problem geht umsonst, wenn Sie zu fgets wechseln.

  • fscanf Parameter, die Werte empfangen, müssen Zeiger sein, aber Sie übergeben ein einzelnes Array-Element. Weil fscanf Varargs ist, ist dies einfach undefiniertes Verhalten. (Einige Compiler haben eine spezielle Behandlung von scanf Formatcodes und werden Sie vor dem Typenkonflikt warnen, aber es gibt keine allgemeine Möglichkeit, Varargs-Typ-Mismatch zu erkennen).

  • Lesen bis zu einem Newline, wie Sie Zeilen zählen, nicht Zeichen. Um einzelne Zeichen zu lesen, verwenden Sie fgetc.