2016-10-30 3 views
1

プログラムの主なアイデアは、テキストをモールスにコード化し、モールスをテキストにデコードすることです。C言語を使用したモールスへのコードテキスト

しかし、プログラムが壊れている、私は2つの単語の間にスペースを書き込むとき、なぜプログラムが動作しないのかわかりません、私はコードとデコードでこの問題があります。 、

この機能で
void encode_out(const char *s) 

sは、入力パラメータであり、それはあなたがその内容を変更していることは確かです:

void encode_out(const char *s){ 
    for(;;++s){ 
     char ch = *s; 
     if(ch == '\0') 
      break; 
     if(isalpha(ch)){ 
      ch = toupper(ch); 
      fputs(table[ALPHA][ch - 'A'], stdout);//`-'A'` depend on the sequence of character code 
     } else if(isdigit(ch)) 
      fputs(table[NUM][ch - '0'], stdout); 
     else if(ch == ' ') 
      fputc('/', stdout);//need rest space skip ? 
     else 
      ;//invalid character => ignore 
     fputc(' ', stdout); 
    } 
    fputc('\n', stdout); 
} 

static void decode_out_aux(MTree *tree, const char *s){ 
    if(tree == NULL) return; 
    if(*s == '\0') 
     fputc(tree->value, stdout); 
    else if(*s == '/') 
     fputc(' ', stdout); 
    else if(*s == '.') 
     decode_out_aux(tree->dot, ++s); 
    else if(*s == '-') 
     decode_out_aux(tree->bar, ++s); 
} 

void decode_out(const char *s){ 
    char *p; 
    while(*s){ 
     p = strchr(s, ' '); 
     if(p){ 
      if(p-s != 0){ 
       char code[p-s+1]; 
       memcpy(code, s, p-s); 
       code[p-s]='\0'; 
       decode_out_aux(root, code); 
      } 
      s = p + 1; 
     } else { 
      decode_out_aux(root, s); 
      break; 
     } 
    } 
    fputc('\n', stdout); 
} 

static void insert_aux(MTree **tree, char ch, const char *s){ 
    if(*tree == NULL) 
     *tree = calloc(1, sizeof(**tree)); 
    if(*s == '\0') 
     (*tree)->value = ch; 
    else if(*s == '.') 
     insert_aux(&(*tree)->dot, ch, ++s); 
    else if(*s == '-') 
     insert_aux(&(*tree)->bar, ch, ++s); 
} 

static inline void insert(char ch, const char *s){ 
    if(*s == '.') 
     insert_aux(&root->dot, ch, ++s); 
    else if(*s == '-') 
     insert_aux(&root->bar, ch, ++s); 
} 

void make_tree(void){ 
    root = calloc(1, sizeof(*root)); 
    //root->value = '/';//anything 
    int i; 
    for(i = 0; i < 26; ++i) 
     insert('A'+i, table[ALPHA][i]); 
    for(i = 0; i < 10; ++i) 
     insert('0'+i, table[NUM][i]); 
} 

static void drop_tree_aux(MTree *root){ 
    if(root){ 
     drop_tree_aux(root->dot); 
     drop_tree_aux(root->bar); 
     free(root); 
    } 
} 

void drop_tree(void){ 
    drop_tree_aux(root); 
} 
+0

私はあなたからの友人のほとんどに会ったと思います''今度は 'isblank()'を満たす時です。 Enterキーを押すと、入力文字列に少なくとも '\ n'(改行文字)が追加されます。 –

+0

[scanfを使用してスペースを入力する方法は?](http://stackoverflow.com/questions/1247989/how-do-you-allow-spaces-to-be-entered-using-scanf) – GoodDeeds

+0

'char **'を期待する関数に 'char **'を渡しているようです。コンパイラは不平を言っているはずです。 'scanf()'の場合と同じです。ポインタを指すためのメモリを割り当てていません。それは修正されるべき多くの問題です。 –

答えて

1

は、おそらく他のいくつかの問題がありますが、少なくとも、あなたはこれを修正する必要がありますしたがってsconst修飾子を持つことができません。それを変更します。同様の問題を持って、あなたのプログラム内の他の機能を探し

void encode_out(char *s) 

、などdecode_outなど

1
char *text; 
char *morse; 
... 
scanf("%s", &text); 
encode_out(&text); 
printf("Enter the morse code: "); 
scanf("%s", &morse); 
decode_out(&morse); 

textmorseはポインタで、参照演算子を追加しないでください。

textは初期化されていないポインタなので、scanfでは使用できません。次のように使用量は次のとおりです。コードの残りの部分については

char text[100]; 
scanf("%s", text); 

、動作する可能性は低いと複雑な上にあります。各モーメントコードを比較するには、翻訳機能を使用します。

char translate(const char* buf) 
{ 
    for (int i = 0; i < 26; i++) 
     if (strcmp(buf, alpha[i]) == 0) 
      return 'A' + (char)i; 
    if (strcmp(buf, "/") == 0) 
     return ' '; 
    for (int i = 0; i < 10; i++) 
     if (strcmp(buf, num[i]) == 0) 
      return '0' + (char)i; 

    //to indicate an error: 
    return '?'; 
} 

使用strtokは、部品の中にモールス信号を破る各部分を翻訳して出力に追加する:

char *decode(const char* src) 
{ 
    char *code = malloc(strlen(src) + 1); 
    char *dst = malloc(strlen(src) + 1); 
    strcpy(code, src); 
    int dst_len = 0; 
    char *token = strtok(code, " "); 
    while (token) 
    { 
     dst[dst_len++] = translate(token); 
     token = strtok(NULL, " "); 
    } 

    free(code); 
    dst[dst_len] = 0; 
    return dst; 
} 

int main(void) 
{ 
    char *dst = decode(".... . .-.. .-.. ---/.-- --- .-. .-.. -.."); 
    printf("%s\n", dst); 
    free(dst); 
    return 0; 
} 

出力:"HELLO WORLD"

+0

あなたは 'scanf'で割り当てることができます。' man scanf'を見て、 '%s、%c、%['(Linuxの古いバージョンではWindowsでは 'a'を修飾子)。 char *へのポインタへのポインタを提供する必要があることに注意してください。 –

+0

@ DavidC.Rankin私はそれを知らなかった。私は今、そのコメントを外すつもりです。 –

+1

確かに、私が見つけたときはすてきなトリックでしたが、新しいユーザーが一般的に遭遇するすべての「eol」と「EOF」条件を正しく説明するために必要な(または一般的に欠けている)以上。 –

関連する問題