2016-07-23 8 views
1

ich alle Interpunktion von einem Wort zu entfernen versuchen. Das Programm liest eine Datei und verwendet dann einen Hash, um alle Vorkommen jedes Wortes zu zählen. Es funktioniert meistens. Ich laufe in Schwierigkeiten, wenn ich auf dieser Linie kommenInterpunktion zu entfernen versuchen, und zählen Worte

, , , , , , , , , . ./ ./ [email protected]#$%^&*()_(&*^%&^%$%$%##%$%$# %%%$ ^%%^ %^%^&^ &^ &^ &^&^ &^ &^ &^ &^ %^%^% %$ %$ %$ 

Mein Programm druckt „, 32

Wenn Worte wäre es

drucken „Wort, eine Zahl“

aber für diesen Fall druckt es, was Im ein leerer String übernehmen und ive versuchte für diese

Hier ist meine Datei, die das Haupt Sachen tut.

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#include<ctype.h> 
#include"hash.h" 

#define SIZE 5000 

void fileRead(char * filename); 
void fileWrite(); 
void removep(char * p); 
struct listnode * hashTable[9000]; 

int main(int argc, char ** argv){ 
    int i; 
    if(argc<2) 
     fprintf(stderr,"Enter filename \n"); 

    hashCreate(hashTable, SIZE); 

    for(i=1; i<argc; i++){ 
     fileRead(argv[i]); 
    } 

    fileWrite(); 
    hashDelete(hashTable, SIZE); 
    return 0; 
} 

void fileWrite(){ 
    FILE * file=fopen("wordfrequency.txt","w"); 
    int i; 
    struct listnode * temp; 
    for(i=0;i<SIZE;i++){ 
     temp=hashTable[i]; 
     if(hashTable[i]->count!=0){ 
      for(temp=hashTable[i]; temp!=NULL; temp=temp->next){ 
       fprintf(file,"%s, %d\n",temp->word, temp->count); 
      } 
     } 
    } 
    fclose(file); 
} 

void fileRead(char * filename){ 
    FILE * file = fopen(filename,"r"); 
    char word[500]; 
    if(!file){ 
     fprintf(stderr,"Error opening file \n"); 
     return; 
    } 
    while(fscanf(file, "%s", word)==1){ 
     removep(word); 
     if(word!=NULL || word[0]!='\0') 
      hashAdd(word,hashTable,SIZE); 
    } 
    fclose(file); 
} 

void removep(char *p) 
{ 
    char *src = p, *dst = p; 

    while (*src) 
    { 
     if (ispunct((unsigned char)*src)) 
     { 
      src++; 
     } 
     else if (isupper((unsigned char)*src)) 
     { 
      *dst++ = tolower((unsigned char)*src); 
      src++; 
     } 
     else if (src == dst) 
     { 
      src++; 
      dst++; 
     } 
     else 
     { 
      *dst++ = *src++; 
     } 
    } 

    *dst = 0; 
} 
+0

Fyi, in 'fileRead',' if (Wort! = NULL || Wort [0]! = '\ 0') 'wird * immer * wahr sein, weil' word' wird * * nie 'NULL' sein, und damit du immer Hash und Einfügen. Ein Basisarray kann niemals 'NULL' sein. Arrays sind keine Zeiger. Diese Klausel sollte 'sein, wenn (* Wort)' – WhozCraig

+0

Bitte nicht nicht verwendeten Code in Ihrer Frage enthält - es macht es in etwas anderes als ein MCVE ([MCVE]), da per definitionem der nicht verwendete Code bedeutet, dass es nicht minimal. –

+0

Ich glaube, WhozCraig ist zu einer Schlüsselzeile gekommen, aber die '||' könnte '&&' sein und dann würde es besser funktionieren - aber du kannst die erste Klausel löschen, wie WhozCraig gesagt hat. Persönlich würde ich 'if (word [0]! =' \ 0 ') 'viel lieber als' if (* word) 'sehen, aber sie sind äquivalent und es ist Geschmackssache. –

Antwort

0

Ich fand es heraus. Ich änderte

if (Wort! = NULL || Wort [0]! = '\ 0')

zu

if (Wort [0]! =‘ ' & & Wort [0]! = '\ 0')

und jetzt funktioniert es perfekt.

Verwandte Themen