2016-09-25 33 views
0

我想獲取用戶輸入的字符串,並查看每個代碼,看看它是否出現在另一個字符串字符串。到目前爲止我的代碼工作。 如果單詞被成功找到,那麼alpha表示將被添加到最終將被打印的數組中,但只有在找到所有代碼的情況下。字符串數組然後打印在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陣列。相反,它被作爲一個字符數組來處理,每個莫爾斯碼元素的第一個字符存儲在該字符中。而當它被打印時,追蹤多少數組被使用的變量被忽略。

另一個問題是,您的代碼使用空格來破解代碼,但行末不一定有空格,這樣代碼可能會錯過。在下面的程序中,我將scanf()換爲fgets(),它在輸入的末尾留下了一個換行符,我們可以使用這個換行符來指示代碼的結束。

其他問題:您在代碼中的錯誤位置打印invalid Morse code消息,並將其打印到stdout而不是stderr;你記得免費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; 
} 

樣品試驗

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

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

感謝您的幫助我真的需要了解指針數組和字符串是如何工作的。我可以開始看他們是怎麼樣的。 – Brett

+0

我現在需要反向。我添加了一個if else語句,用於檢查第一個元素以查看它是否爲do,短劃線或字符。如果它是一個字符,那麼我需要比較它並打印莫爾斯電碼。我似乎有問題使用strcmp。我認爲這可能是因爲我正在比較alpha [x]和input [i] – Brett