2016-05-11 4 views
2

私はCを初めて使っていますので、私の誤解を許してください。私は、ユーザーのキャラクター入力を受け取り、それを突然変異させ、それを "ブタクラシ"でプリントアウトする簡単なプログラムを書こうとしています...単語の最初の文字が単語の最後に移動し、その後 "ay"単語の末尾に追加されます。例 - >「like」という言葉が「ikelay」になります。ここに私のプログラムがあります...プログラムはEOFで終了せず、最後の文字が '[スペース]'の場合は印刷されません

//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); 

} 

私は長い間それを続けてきました。私はどこで間違いを犯したのか分かりません。私はプログラムについてはあまり気にしません。私は入力を「ブタクラシ」に変換する必要はありませんが、私が間違って行ったことを本当に知りたいです!ヘルプ、アドバイス、および/またはポインタが素晴らしいでしょう!これにより

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

:あなたは

+0

注: 'j'や' m'よりも有用な変数名を考えてください。 – chux

答えて

0

この行を置き換え感謝

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

そうでない場合は、Enterキーを押すたびに、ループがオーバーが開始されます。たぶん誰かがそれを説明することができますが、上記のコードはあなたのコードがあなたが望むことを行えるようにします。

今後は、fgets()などの関数が、EOFなどのチェックを心配する必要がないため、必要に応じてより適切な場合があります。その場合は、最後に改行を削除するだけです。

+0

助けてくれてありがとうが、これはうまくいきません。これは、行の最初の単語を変更して出力するだけです。私はそれが私のようにEOFを使用することができない理由についての説明がありますか?私は 'fgets()'と不公平です。私はこれまでに学んだことだけを使用しようとしています(これはK&Rの第1章です) – MikeG

1

配列の境界外に書き込む。 <

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'; 
    } 
} 

があまりにも

+0

これはありがたいことにcertianly私は見逃しました。同じ。それでも、ブタの形で1つの単語しか印刷されませんが、 – MikeG

0

ヘルプフォーム@chuxでは、何が起こっているのを見つけるために、いくつかのより多くのprint文を使用した後、他の問題が発生することがあります使用し、私は、関数でsortWords変数iがないことに気づきました'' '文字または改行またはタブ文字' '\ n' 'と' '\ t' 'に達した場合にインクリメントされます。機能をこれに変更した後...

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; 
    } 

} 

} 

このプログラムは、少なくとも多少予想通り機能します。この質問で解決するために設定したバグは、少なくとも修正されています。まだ完璧ではありませんが、これは私にとっては不十分な質問だったと思います。

関連する問題