2017-09-27 9 views
0

Iは、スクリプトに渡された引数からスクリプトに渡された引数から符号なし整数配列を作成する方法は?

char** str_split(char* a_str, const char a_delim) 
{ 
char** result = 0; 
size_t count  = 0; 
char* tmp  = a_str; 
char* last_comma = 0; 
char delim[2]; 
delim[0] = a_delim; 
delim[1] = 0; 

/* Count how many elements will be extracted. */ 
while (*tmp) 
{ 
    if (a_delim == *tmp) 
    { 
     count++; 
     last_comma = tmp; 
    } 
    tmp++; 
} 

/* Add space for trailing token. */ 
count += last_comma < (a_str + strlen(a_str) - 1); 

/* Add space for terminating null string so caller 
    knows where the list of returned strings ends. */ 
count++; 

result = malloc(sizeof(char*) * count); 

if (result) 
{ 
    size_t idx = 0; 
    char* token = strtok(a_str, delim); 

    while (token) 
    { 
     assert(idx < count); 
     *(result + idx++) = strdup(token); 
     token = strtok(0, delim); 
    } 
    assert(idx == count - 1); 
    *(result + idx) = 0; 
} 

return result; 

}

uint8_t in[] = {0X08,0X3c,0Xe6,0Xe3,0Xb9,0X74,0X4a,0Xdc,0Xd7,0X29,0Xee,0X99,0X35,0X15,0X8a,0X77}; 

ような符号なし整数の配列を作成する必要があります。引数は

./conversion 0X08,0X3c,0Xe6,0Xe3,0Xb9,0X74,0X4a,0Xdc,0Xd7,0X29,0Xee,0X99,0X35,0X15,0X8a,0X77 

ようなスクリプトに渡されますが、私は私がスクリプトを実行したときに、私は次の警告を取得しています

char** tokens; 
tokens = str_split(argv[1], ','); 
uint8_t hex[100]; 
uint8_t in[100]; 

if (tokens) 
{ 
    int i; 
    for (i = 0; *(tokens + i); i++) 
    { 
      printf("val=[%s]\n", *(tokens + i)); 

      in[i] = *(tokens + i); 

     free(*(tokens + i)); 
    } 
    printf("\n"); 
    free(tokens); 
} 

for (i = 0; i < 16;i++) 
printf("%02x ",in[i]); 

引数から配列を作成するには、次のコードを作成し

warning: assignment makes integer from pointer without a cast 

しかし、私は各値を印刷することができます

printf("val=[%s]\n", *(tokens + i)) 

これを配列として保存することはできません

コードに間違いがありますか?手伝っていただけませんか ?

+0

ご返信いただきありがとうございます。そのような配列を生成する方法はありますか? –

+0

さらに良くなるのは[mcve]でしょう。あなたの 'str_split'メソッドが欠けているので、もし誰かが自分のために働くコードを再現したいのであれば、それはできません。 –

+0

彼は私が見ることができるfree() 'dポインタを再利用しません。彼はchar **トークンではなく、char *トークンを自由にします。私はfree()の後で反復されるので、別のポインタです。 – torstenvl

答えて

1

tokensは、ポインタへのポインタタイプchar **tokensです。したがって、*(tokens+i)はポインタです。そのポインタを(文字列に)整数のように扱っています。

まず、文字列を整数型に変換します。 strtoul()は良い出発点です。ベースを指定することもできますので、自動的に16進数から変換します。

for (i = 0; tokens[i]; i++) 
{ 
    char *endptr; 
    unsigned long tmp; 
    printf("val=[%s]\n", tokens[i]); 
    tmp = strtoul(tokens[i], &endptr, 16); 
    if (endptr == tokens[i]) { 
     /* end of valid number is the beginning of the string */ 
     /* that means there was no valid number */ 
     /* insert error handling here (e.g. reprinting usage) */ 
     in[i] = (uint8_t)0; 
    } else { 
     in[i] = (uint8_t)tmp; 
    } 
    free(tokens[i]); 
} 
+0

あなたの返信にTorstenvlに感謝します。これを達成するために何ができるのか教えてください。 –

+0

私はあなたのフォローアップの質問を理解していません。 – torstenvl

+0

申し訳ありませんTorstenvl、上記で試してみましょう –

関連する問題