2016-09-25 3 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. Вместо этого он управляется как массив символов, в который хранится первый символ каждого элемента кода Морзе. И когда он печатается, переменная, которая отслеживает, сколько из массива используется, просто игнорируется.

Другая проблема заключается в том, что ваш код использует пробелы для разрыва кодов, но в конце строки не обязательно будет пробел, поэтому код может быть пропущен. В приведенной ниже программе я отключил 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, который проверяет первый элемент, чтобы увидеть, является ли это типом, тире или символом. Если это персонаж, мне нужно сравнить его и распечатать код Морзе. Кажется, у меня проблемы с использованием strcmp. Я думаю, это может быть потому, что я сравниваю альфа [x] со входом [I] – Brett

Смежные вопросы