2016-09-25 9 views
0

私はユーザー入力文字列を取って、各コードを見て文字列の別の文字列に現れるかどうかを調べようとしています。これまでのところ私のコードが動作します。 単語が正常に見つかった場合、最終的に印刷される配列にアルファ表現が追加されますが、すべてのコードが見つかった場合に限ります。配列への文字列を次にcで印刷

印刷しようとしているアレイに格納されているものに問題があります。

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

typedef char *string; 
typedef char *alpha; 

int main(void) 
{ 
    string morse[4]={".-", "-...","----.", ".."}; 
    string alpha[4]={"A", "B", "9",  "I"}; 
    char prntArr[50]; 
    char *input; 
    char *hold; 
    input = malloc(200); 
    hold = malloc(50); 
    int i=0; 
    int j=0; 
    int ret; 
    int x; 
    int w=0; 
    int z=0; 
    printf("please enter a string\n"); 
    scanf("%[^\n]",input); 

    do{ 
     if (input[i] !=' ') 
     { 
     hold[j] = input[i]; 
     j++; 
     } 
     else 
     { 
     hold[j]='\0';     

     for (x=0;x<4;x++) 
     { 
      printf("value of x %d\n",x); 

      ret = strcmp(morse[x], hold); 
      if (ret==0) 
      { 
       printf("%s\n",alpha[x]); 

       prntArr[w]=*hold; 
       w++; 
       x=4; 
      } 
      else 
      { 
       ret=1; 
       printf("invalid Morse code!"); 

      } 
     } 
     j = 0; 
     } 
     i++; 
    }while(input[i] !='\0'); 

    for (z=0;z<50;z++) 
    { 
     printf("%c",prntArr[z]); 
    } 

    return 0; 
    free(input);  
} 
+0

を実行サンプル入力と期待される出力を追加してください。 –

答えて

1

あなたが尋ねた問題は、プログラムでprntArrが使用されていることが原因です。それは実際にalpha配列への文字ポインタの配列でなければなりません。代わりに、各モールスコード要素の最初の文字が格納される文字の配列として操作されます。そしてそれが印刷されるとき、配列のどれくらいが使われているかを追跡する変数は単に無視されます。

別の問題は、コードでスペースを使用してコードを分割することですが、コードの末尾には必ずしもスペースがないため、コードが欠落する可能性があります。以下のプログラムでは、fgets()scanf()を切り替えました。これはスペースのように入力の最後に改行文字を残して、コードの終わりを示します。

その他の問題:コードの間違った箇所にinvalid Morse codeメッセージを印刷し、stderrではなくstdoutに印刷します。あなたは無料でinputを覚えていますが、無料で忘れるのは、holdです。決して呼び出されないreturnの後にコードを置きます。以下は

は、いくつかのスタイルの問題とともに、上記の問題に対処し、あなたのコードの手直しです:

#include <stdio.h> 
#include <string.h> 
#include <stdbool.h> 

int main(void) 
{ 
    char *morse[] = {".-", "-...", "----.", ".."}; 
    char *alpha[] = {"A" , "B" , "9" , "I" }; 

    char *print_array[50]; 
    int print_array_index = 0; 

    char hold[50]; 
    int hold_index = 0; 

    char input[200]; 
    int i = 0; 

    printf("please enter a string: "); 
    fgets(input, sizeof(input), stdin); 

    while (input[i] !='\0') { 

     if (input[i] ==' ' || input[i] == '\n') 
     { 
      hold[hold_index] = '\0'; 

      bool found = false; 

      for (int x = 0; x < sizeof(morse)/sizeof(char *); x++) 
      { 
       if (strcmp(morse[x], hold) == 0) 
       { 
        print_array[print_array_index++] = alpha[x]; 

        found = true; 

        break; 
       } 
      } 

      if (!found) 
      { 
       fprintf(stderr, "invalid Morse code: %s\n", hold); 
      } 

      hold_index = 0; 
     } 
     else 
     { 
      hold[hold_index++] = input[i]; 
     } 

     i++; 
    } 

    for (int x = 0; x < print_array_index; x++) 
    { 
     printf("%s ", print_array[x]); 
    } 

    printf("\n"); 

    return 0; 
} 

SAMPLEは

> ./a.out 
please enter a string: ----. -... .- .. 
9 B A I 
> 

> ./a.out 
please enter a string: .- --- .. 
invalid Morse code: --- 
A I 
> 
+0

ありがとう、私は本当にポインターの配列と文字列すべての仕組みを理解する必要があります。私は彼らの姿を見ることができます。 – Brett

+0

私は今逆にする必要があります。私はdo、dashまたはcharacterかどうかを調べる最初の要素をチェックするif else文を追加しました。それが文字であれば、それを比較してモールス符号を印刷する必要があります。私はstrcmpの使用に問題があるようです。アルファ[x]と入力[I]を比較している可能性があります – Brett