2012-03-25 8 views
-2
#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    int i; 
    int counter=0, counter2=0; 
    char *s; 
    char name[30]; 
    char vowel[6] = "AEIOU"; 
    char consonants[21] = "BCDFGHJKLMNPQRSTVWXYZ"; 

    printf ("input the string: "); 
    scanf ("%s", name); 
    printf ("The string is %s\n", name); 
    for (i=0; name[i]!='\0'; i++) { 
    if (s = strchr(vowel, name[i])) { 
     counter++; 
    } 
    else if (s =strchr(consonants, name[i])) { 
     counter2++; 
    } 
    printf ("First counter is %d\n", counter); 
    printf ("The second counter is %d\n", counter2); 
    return 0; 
    } 
} 

そして、私のコードで何が問題になっていますか?カウンターはなぜ機能していないのですか? 私はたくさんの方法を試しましたが、何も動作しないので、誰かが私のために説明することができます。私の文字列の母音と母音の数をCで調べようとしています

+0

あなたはあなたのプログラムが失敗した正確にどのように追加することができます - それは何を印刷していますか?何が印刷されますか? – nietaki

+4

これは以前の質問とどのように違うのですか? http://stackoverflow.com/questions/9864558/stack-with-finding-character-inside-string-in-c-language –

+3

そして、将来的には、あなたのコードをインデントしてください。それはあなたを助け、コードを読んでいる人(あなたの先生も含む)に役立ちます。 –

答えて

10

コードにインデントを追加しました。これにより、return文とprint文がforループ内にあることが明らかになります。それらはループの外側にある必要があります。

4

}{の配置問題の他に、consonants[21]consonants[22]である必要があります。より安全な方法は、consonants[]を使用することです - コンパイラはあなたのための文字の数を数えます。

return 0; 
    } 
} 

が、次のようになります:

2

3つの最後の行がある

} 
    return 0; 
} 

レッスン:インデントが重要です。

0

は、任意の長さの文字列を読み取るためにscanfを使用しないでください:

#XXX never do that 
char name[30]; 
scanf("%s", name); 

入力が指定されたサイズよりも大きい場合、bad thingsは、実行されている任意のコードとして起こることができます。

代わりfgetsを使用することもできます。

char buf[BUFSIZ]; 
while (fgets(buf, sizeof(buf), stdin)) { 
    // buf contains a line or part of it; 
    // long lines are spread among multiple chunks 
    process_chunk(buf); 
} 

if (!feof(stdin)) 
    ; // error 

それはコメントする必要があります。私はコード例を含める答えとして投稿しました。

2

まず、英語のアルファベットには21個の子音があるので、配列は22個の要素でなければなりません(終端の '\ 0'文字に対応するため)。

第2に、子音が母音でない場合は子音であるため、子音を一切テストする必要はありません。したがって、子音の配列を完全に削除し、子音の配列を重複して調べるのではなく、単にelseステートメントを使用することで、この問題を解決することができます。

第3に、各文字の名前ごとに各カウンタの値を印刷するつもりでしたか?それは奇妙に思える。 また、一度だけ返す必要があります。現在のところ、ループを1回だけ行った後、メインから戻ってきます。そうではありません... printfとreturn文の両方をforループの外に移動する必要があります。それはすべて私が得た...あなたがそれらの修正を行う場合、あなたのコードを実行する必要があります。

0

ニースの使用strchr!私の好きな機能の1つはstring.hです。ただし、いくつかのメモ:

  1. 大文字のみをチェックしています。 toupper()を見て、テスト文字を母音と比較する前に大文字に変換してください。

  2. 文字が文字で母音でない場合は、それは子音です。代わりに、子音のための別々の配列を構築する、isalpha()機能を見て、あなたがstrchr()に2回目の呼び出しの代わりにあなたのプログラムにそれを組み込むことができる方法を考えます。あなたは子音リストの文字を忘れることを心配する必要はありません!

関連する問題