2016-05-17 12 views
0

Ich versuche, eine Zeichenfolge aus einer Datei mit dem folgenden Code zu scannen. Aber mein Programm druckt seltsame Zeichen. Irgendwelche Ideen, wie man das stoppt und wie man Leerzeichen zwischen Wörtern beim Drucken der Schnur behält?Scannen von einer Datei in C

hier sind die Inhalte der Datei (test.txt)  (test.txt)

Hier ist der Ausgang meines Programms ist:

output

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

typedef struct 
{ 
    char word[80]; 
    int length; 
    int freq; 
} sent; 

int main() 
{ 
    sent a[50]; 
    int v,status; 
    int i=0,cnt=0; 
    char*y; 

    FILE*p; 
    p=fopen("C:\\Users\\User\\Desktop\\test.txt","r"); 
    status=fscanf(p,"%s",a[i].word); 
    while(status !=EOF){ 
     i++; 
     status=fscanf(p,"%s",a[i].word); 
    } 
    for(i=0;i<50;i++) 
    { 
     char *y=strtok(a[i].word,"[email protected]#$%&*?."); 

     while(y!=NULL) 
     { 
     printf("%s",y); 
     y=strtok(NULL,"[email protected]#$%&*?."); 

     } 
    } 
} 
+6

Bitte poste den Inhalt von test.txt. Meine Vermutung ist, dass Sie nicht 50 Wörter in der Datei haben. –

+0

fscanf (p, "% s", ein [i] .word); kann in einem Pufferüberlauf enden, verwenden Sie fscanf (p, "% 79s", a [i] .word); oder fgets(). und nach Fehlern auf Fehler prüfen() – 12431234123412341234123

Antwort

0

Es ist einfach String-Manipulation ist. Ich debuggte und änderte Ihr Programm ein wenig, so dass es Textausgabe anstelle von Junk gibt. Möglicherweise müssen Sie sie noch ändern, aber jetzt wird der Inhalt der Datei gedruckt. Der Grund dafür, dass Sie ein Junk-Zeichen erhalten haben, ist, dass die Schleife nicht weiß, wann sie aufhören soll, wenn die Zeichenkette nicht beendet wird, sodass Sie Speicherinhalte von etwas anderem erhalten. Der empfohlene Weg ist fgets, um eine Datei zu lesen und Whitespace wird beibehalten.

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

typedef struct { 
    char *word; 
    int length; 
    int freq; 
} sent; 

int words(const char *sentence) { 
    int count, i, len; 
    char lastC; 
    len = strlen(sentence); 
    if (len > 0) { 
     lastC = sentence[0]; 
    } 
    for (i = 0; i <= len; i++) { 
     if (sentence[i] == ' ' && lastC != ' ') { 
      count++; 
     } 
     lastC = sentence[i]; 
    } 
    if (count > 0 && sentence[i] != ' ') { 
     count++; 
    } 
    return count; 
} 

int main() { 
    sent a[50]; 
    int v, status; 
    int i = 0, cnt = 0; 
    FILE *p; 
    p = fopen("data.txt", "r"); 
    char buf[100], title[100]; 
    fgets(buf, sizeof buf, p); 
    int j = words(buf); 
    char *yy; 
    yy = strtok(buf, "[email protected]#$&*?%."); 

    while (yy != NULL) { 
     a[i].word = yy; 
     yy = strtok(NULL, "[email protected]#$&*?%."); 
     i++; 
    } 

    for (int k = 0; k<i; k++) { 
     printf("%s", a[k].word); 
    } 
} 

Das Programm tokenisiert den Puffer und behält den Leerraum bei. Ich änderte die Art, wie Sie die Datei lesen, auf fgets.

data.txt

Auf einer Skala von eins bis zehn, was $ Ihre Lieblingsfarbe des Alphabets ist

Ausgang

Auf einer Skala von eins bis zehn was ist deine Lieblingsfarbe des Alphabets

+2

Bitte beschreiben Sie, welche Änderungen Sie am OP-Code vornehmen mussten, damit er für Sie funktioniert. –

+0

@RSahu Ich fügte verbesserten Code und mehr Beschreibung hinzu. Ich hoffe, Sie genehmigen oder kommentieren Sie noch einmal. –

+0

@ Programmer400 - Sie erwähnen nicht, warum Ihr Code ist besser oder warum sein Code fehlgeschlagen .... – Soren

2

Da die Menschen kommentiert haben, sind Sie wahrscheinlich 50 Wörter in der Datei, die Sie nicht gelesen haben, aber Ihre Schleife versucht ohnehin über 50 bis Schleife ...., so dass diese Linie

for(i=0;i<50;i++) 

sollte

modifiziert werden
int w; 
for(w=0;w<i;w++) 

und Sie sollten die Verwendung von i durch w innerhalb der Schleife ersetzen (oder vielleicht wollten Sie die Variable cnt innerhalb der while-Schleife verwenden, da diese in Ihrem Code derzeit nicht verwendet wird).

Und Sie brauchen Schutz für Pufferüberläufe, die passieren würden, wenn Ihre Datei mehr als 50 Wörter usw. hätte, aber das ist außerhalb des Rahmens dieser Antwort.

aktualisieren Ihren Kommentar zu beantworten:

Um Platz zwischen den Wörtern zu haben, Sie einfach fügen Sie sie einfach an den Ausgang, wie

printf("%s ",y); 

Ihre Scanf wird die Zeichenfolge Scan auf jeder jedoch beenden Leerzeichen, also Leerzeichen (hex 20), Zeilenumbrüche (\ n), Tabulatoren (\ t) oder returns (\ r) werden alle abschließenden Zeichen für Ihre Strings sein - Wenn Sie dieselben beibehalten und ausgeben wollen, scannen Sie einfach für diese auch, wie

char theString[50]; 
    char theSpace; 
    int matched = scanf("%s%c",theString, theSpace); 

und wenn angepasst == 2 dann Sie beide einen String und den Raum, der den Scan beendet gescannt haben, und Sie können es wie drucken

printf("%s%c",theModifiedString,theSpace); 
+0

so bezieht sich "ich" hier auf die Anzahl der Wörter nicht die Anzahl der Zeichen in der Datei ..... ich zählte die Wörter in der Datei und änderte die Schleife nach der Zahl ... es funktionierte, aber es gibt keine Leerzeichen zwischen den Wörtern wie kann ich die Abstände zwischen ihnen behalten? .... danke für die Antwort, die es half –

+0

Sehen Sie die aktualisierte Antwort – Soren

+0

, wenn ich 'printf ("% s ", y) verwendete;' es funktioniert nicht, weil Ich habe Sonderzeichen zwischen den Zeichen des Wortes selbst, so wird es Leerzeichen zwischen den Zeichen im Wort geben. –