2016-05-11 5 views
2

Ich bin neu in C, bitte verzeih mir meine Missverständnisse. Ich versuche, ein einfaches Programm zu schreiben, das eine Benutzerzeicheneingabe nimmt, es mutiert und es in "piglatin" ausdruckt ... wo der erste Buchstabe eines Wortes zum Ende des Wortes und dann ein "ay" bewegt wird ist an das Ende des Wortes angehängt. Beispiel-> das Wort "wie" wird ... "ikelay". Hier ist mein Programm ...Das Programm wird nicht mit EOF beendet und nicht gedruckt, wenn das letzte Zeichen '[Leerzeichen]' ist.

//pig latin 

#include <stdio.h> 
#define MAX 1000 

void pigify(char chars[], int cnt); 
void sortWords(char stream[], int total); 
void clearWord(char word[], int j); 

int main(){ 

    int c, i; 
    char allChars[MAX]; 


    i = 0; 

    while((c = getchar()) != EOF){ 
     allChars[i] = c; 
     ++i; 
    } 

    allChars[i] = '\0'; 

    sortWords(allChars, i); 

    return 0; 

} 



///////////////// 
///////////////// 
void sortWords(char stream[], int total){ 

    int i, j, start, end, m; 
    char words[total]; 

    clearWord(words, total); 

    i = j = end = m = 0; 

    while(stream[i] != '\0'){ 
     if(stream[i] != '\n' && stream[i] != '\t' && stream[i] != ' '){ 
      ++i; 
      ++j; 
     } else if (j > 2){ 
      end = i; 
      for(start = i-j; start <= end; ++start){ 
       words[m] = stream[start]; 
       ++m; 
      } 

      pigify(words, m); 
      clearWord(words, m); 
      j = m = 0; 
     } 

    } 

} 

///////////////// 
///////////////// 
void clearWord(char word[], int i){ 
    int j; 

    for (j = 0; j <= i; ++j){ 
     word[j] = '\0'; 
    } 

} 



///////////////// 
///////////////// 
void pigify(char alls[], int cnt){ 

    int j; 
    char pchars[cnt+3]; 

    j = 0; 

    while(alls[j] != '\0'){ 
     pchars[j] = alls[j]; 
     ++j; 
    } 


    if(alls[0] != 'a' && alls[0] != 'e' && alls[0] != 'i' && alls[0] != 'o' &&  alls[0] != 'u'){ 
     pchars[cnt] = alls[0]; 
     pchars[cnt+1] = 'a'; 
     pchars[cnt+2] = 'y'; 
     pchars[cnt+3] = '\0'; 
     pchars[0] = ' '; 
    } 


    printf("\npost pigification --> %s\n", pchars); 

} 

Ich bin schon lange darauf und ich kann nicht finden, wo ich einen Fehler gemacht habe. Das Programm interessiert mich nicht so sehr, ich muss den Input nicht in "piglatin" umwandeln, aber ich würde wirklich gerne wissen, was ich falsch gemacht habe !!! Hilfe, Ratschläge und/oder Hinweise wären toll! danke

+0

Hinweis: Betrachten Sie nützlichere Variablen Namen als 'j' und' m'. – chux

Antwort

0

diese Zeile ersetzen:

while((c = getchar()) != EOF){ 
    allChars[i] = c; 
    ++i; 
} 

mit diesem:

while ((allChars[i] = getchar()) != '\n') 
    i++; 

Andernfalls über jedes Mal, wenn Sie die Eingabetaste drücken, beginnt die Schleife. Vielleicht kann jemand anderes das erklären, aber der obige Code lässt Ihren Code tun, was Sie wollen.

In Zukunft könnte eine Funktion wie fgets() besser für Ihre Bedürfnisse geeignet sein, da Sie sich keine Gedanken über EOF und ähnliches machen müssen - Sie müssen nur den Zeilenumbruch am Ende in diesem Fall entfernen.

+0

Danke für die Hilfe, aber das funktioniert auch nicht. Es mutiert nur und druckt das erste Wort in der Zeile. Haben Sie eine Erklärung, warum ich EOF nicht so verwenden kann, wie ich es habe? Ich bin nicht vertraut mit 'fgets()', ich versuche nur das zu verwenden was ich bisher gelernt habe (was nur Kapitel eins von K & R ist) – MikeG

1

Außerhalb von Array-Grenzen schreiben. Verwenden <

char words[total]; 
clearWord(words, total); 

void clearWord(char word[], int i){ 
    int j; 
    // for (j = 0; j <= i; ++j){ 
    for (j = 0; j < i; ++j){ 
     word[j] = '\0'; 
    } 
} 

andere Probleme zu

+0

danke dafür, genau ein Fehler den ich verpasst habe, aber das Ergebnis ist das gleich. Es wird immer noch nur ein einziges Wort in der Piglatin-Form gedruckt, – MikeG

0

Mit Hilfe Form @chux Mai haben und nach etwas mehr Druck-Anweisungen, um herauszufinden, was los ist, erkannte ich, dass in der Funktion sortWords die Variable i war nicht inkrementiert für den Fall, dass ein Leerzeichen '' '' Zeichen oder ein neues Zeilen- oder Tabulatorzeichen '' \ n '' und '' \ t '' erreicht wurde. Nach dem Ändern der Funktion auf diese ...

void sortWords(char stream[], int total){ 

int i, j, start, end, m; 
char words[total]; 

clearWord(words, total); 

i = j = end = m = 0; 

while(stream[i] != '\0'){ 
    if(stream[i] != '\n' && stream[i] != '\t' && stream[i] != ' '){ 
     ++i; 
     ++j; 
    } else if (j > 2){ 
     end = i; 
     for(start = i-j; start <= end; ++start){ 
      words[m] = stream[start]; 
      ++m; 
     } 

     pigify(words, m); 
     clearWord(words, m); 
     j = m = 0; 
     ++i; 
    } 

} 

} 

Das Programm funktioniert zumindest etwas mehr als erwartet. Die Bugs, die ich mit dieser Frage lösen wollte, sind zumindest behoben. Immer noch nicht perfekt, aber ich denke, das war eine schlecht gestellte Frage meinerseits und sollte beendet werden