2016-09-16 6 views
0

私は本に書かれている問題に悩まされています。問題がある -プログラムが予期せぬ出力を与えているのはなぜですか?

プロトタイプインターネット初心者がmessages.Hereの典型的なB1FFコミュニケ:

H3Y DUD3、C 15 R1LLY C00L

書き込みをwriringのユニークな方法を持っている仲間の名前B1FF、ありますユーザーが入力したメッセージを読み取り、B1FF-話すに変換します「B1FFフィルタ」:男ねえ、Cはrilly B1FF-話すで
を冷却されています:H3Y DUD3、C 15 R1LLY C00L



メッセージを入力します。 あなたのプログラムは、 (A = 4、B = 8、E = 3、I = 1、O = 0、S = 5)の大文字と小文字を代用する。プログラムはアルファベットに変換されていない理由を私は理解していないプログ IMAGE



OF

私のプログラム -

#include<stdio.h> 
    int main() 
    { 
     char arr[50]={0},ch[50]={0}; 
     int i=0; 
     printf("\nenter the sentence : "); 

     while(arr[i-1]!='\n') 
     { 
     scanf("%c",&arr[i]); 
     i++; 
     } 

     i=0; 

     while(arr[i]!='\n') 
     { 
     if(arr[i]=='e') 
     ch[i]='3'; 
     if(arr[i]==('A'||'a')) 
     ch[i]='4'; 
     if(arr[i]==('B'||'b')) 
     ch[i]='8'; 
     if(arr[i]==('I'||'i')) 
     ch[i]='1'; 
     if(arr[i]==('o'||'O')) 
     ch[i]='0'; 
     if(arr[i]==('S'||'s')) 
     ch[i]='5'; 

     else ch[i]=arr[i]-32; 
     i++; 

    } 

    ch[i]='\n'; 
    i=0; 
    printf("\nIn B1FF-SPEAK : "); 

    while(ch[i]!='\n') 
    { 
    printf("%c",ch[i]); 
    i++; 
    } 

    printf("\n"); 
    return 0; 
} 


OUTPUTとなぜscanf()ではない文字としてspaceを受け入れますか?

+0

は、デバッガでそれウォークスルー。 iの値に注意を払う - 特にそれを引いた行の中で、それを配列インデックスとして使用する行で! –

+1

なぜ、 'scanf'を使って1文字を読むのですか?あなたは知っている、それは文字列全体を読むことができる、右か?また、 'man scanf'を読んで、スペースで何をしているのか理解してください。 –

+0

if文の論理的な誤りを見ることができるように、コードを適切にインデントします。 –

答えて

5

まず第一に、あなたは

if(arr[i]==('A'||'a')) 

のようなチェーン論理OR演算子をすることができず、これが常にTRUE条件に解決ので、あなたがを期待しているものを手に入れます。 [('A'||'a')がTRUEと評価さ]

をあなたは、

  • ch[i]=='8';ch[i]==1;を言っ

    if ((arr[i]=='A') || (arr[i] =='a')) 
    

    を使用する必要がありますが、基本的文です。比較結果を比較して破棄しています。割り当てが必要な場合は、=を使用する必要があります。

    else ch[i]=arr[i]-32;のみ
  • は以前if声明、ノー全体ifチェーンと結合します。その部分を処理するには、switchケースまたはif-else if-else構造を使用することができます。

  • あなたは別々に空白を処理しませんでした。


による上記第二の点に、手の込んだするには、あなたのコードは、基本的に大文字に小文字を変換するだけで貧しい試みです

while(arr[i]!='\n') 
    { 
    if(arr[i]==('S'||'s')) //always false 
    ch[i]='5'; 

    else ch[i]=arr[i]-32; //always TRUE 
    i++; 
} 

に減少します。文字列に非アルファ入力がある場合、コードは爆発します。 scanf()が文字としてスペースを受け付けていませんなぜ

に関して、言っ

一部、scanf()が完全%cと入力としてスペースを受け入れ、それはあなただけでASCII value of decimal 32を持ってspaceから32を引い盲目的によってそれを何NULnull)を変換しないのです。 NULは印刷できません。出力には表示されません。

+2

真実ですが、このコードの多くの問題の1つだけです。 –

+0

答えがありがとうございました。私のコードは間違っていましたが、少なくとも「e」は「3」に変換する必要があります。変換されないのはなぜですか? – user239887

+0

@sourav oopsは誤って書かれています。私はそれを編集しましたが、再び同じ結果を得ています。 – user239887

1

いくつかの提言:

  • scanf("%c"...)に少しのコールの多くを使用しないでください。 fgets()manpage)を使用してください。 fgetsは、入力から1行全体を読み込み、バッファ(改行を含む)に格納し、最後に '\ 0'バイトを貼り付けることで、文字列の長さを知ることができます。 (manpage)。任意の文字を入力として受け取ります。入力が小文字である場合、出力はその文字の大文字のバージョンです。それ以外の場合、出力は入力と同じになります。

  • アレイをインプレースで更新します。 2つの配列は必要ありません。アレイをfgets()で読んで、それを翻訳ロジックでループし、行くごとに各文字を更新し、配列をfputs()で書き出します。

  • switch文について学んでください。 switch文は、コードをよりコンパクトにして読みやすくします。すべての文字 - >数値変換で1つのケースが必要で、他のすべてのケースではデフォルトのケースが必要です。

    c = toUpper(c); 
    switch (c) { 
        case 'A': c = '4'; break; 
        case 'B': c = '8'; break; 
        .... 
        default: break; 
    } 
    
関連する問題