2017-05-03 16 views
0

これはmy last questionの続きです。C - strtokを使用して文字列の配列を文字配列に分割する

これまでのところ、私はユーザー入力に成功し、文字列に格納しました。この中へ

1:E 2:B 2:B 2:B 4:G 

:文字列の配列です 1:E2:B2:B2:B4:G
例えば、私はこれを回しました。

これは私が次の何をしたいのかですが、それは私のために働いていない: 1E2B2B2B4G
そして、これらの各文字の配列に格納されている文字になります。

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

#define MAX_INPUT_SIZE ((sizeof(char)*96) + (sizeof(int)*48)) 

int main() { 

    char *input = malloc(MAX_INPUT_SIZE); 

    printf("Example input: 1:E 2:C 2:C 2:C 8:D\n"); 
    printf("Your input:\n\n"); 

    fgets(input, MAX_INPUT_SIZE, stdin); 

    // Removing newline 
    if ((strlen(input) > 0) && (input[strlen(input) - 1] == '\n')) 
     input[strlen(input) - 1] = '\0'; 

    int i = 0; 
    char *p = strtok(input, " "); 
    char *array[MAX_PAIRS]; 

    while (p != NULL){ 
     array[i++] = p; 
     p = strtok(NULL, " "); 
    } 

    // Checking the array 
    int j = 0; 
    for (j=0; j<i; j++) { 
     printf("\n %s", array[j]); 
    } 

そして、このコードはうまく動作します:ここで

は、私が正しく動作して持っているコードの塊です。次の私は現在で働いているコードは次のとおりです。

int k = 0; 
    int l = 0; 

    char *letter = malloc(sizeof(char) * (i * 2)); 

    for (k=0; k<i; k++) { 
     char *q = strtok(array[k], ":"); 

     while (q != NULL) { 
      letter[l++] = q; 
      q = strtok(NULL, ":"); 

     } 
    } 

    // Checking the array 
    int m = 0; 
    for (m=0; m<l; m++) { 
     printf("\n %c", letter[m]); 
    } 

    return 0; 
} 

私は、配列を確認するために行く、それは私が印刷したい各文字のごみ記号を出力します。私はここで間違ったことを理解していません。

+0

'letter [l ++] = q;' - > 'letter [l ++] = * q;' – BLUEPIXY

+0

@BLUEPIXYありがとうございます。しかし、私は以下の答えで言及したように、その背後にあるロジックがどのように機能するのかはまだ正確にはわかりませんが、今は私のコードがうまくいくので、私は満足しています。 –

+0

'* q'はポインタが指す文字です。 – BLUEPIXY

答えて

1

letterは、charの配列である。
qは、char*です。

したがって、letter[l++] = qは、char*charに保存しているので、あなたが望むことはしません。私は、コンパイラが切り捨てについていくつかの警告を吐き出すだろうと思います。

+0

よろしくお願いします。これはおそらく 'char *'と 'char'を混ぜ合わせた1000回目です。 編集:時間があれば、 'q 'の前に' * 'を入れなければならなかった理由を説明できますか?私はもともと両方を 'char * letter = 'として定義していたからです。 。 .'と '' char * q = ''になります。 。 」。これまでアスタリスクの数が同じであれば、数学はうまくいくと私は常に考えてきました。 –

+0

これについて考える方法の1つは、あなたが少し楽しい(そして/または他のコーダーを悩ませる)もので、 'array [index]'が '*(array + index)'に変わるということです。そこに逆参照されているのを見てください。つまり、 'letters'はchar *ですが、letters [l ++]'はcharです。あなたが持つことができる楽しさは、 'index [array]'が 'array [index]'と同じ結果を与えることができるということです。 –

関連する問題