2017-09-27 41 views
0

我需要创建一个无符号整数数组一样如何从传递给脚本的参数中在c中创建一个无符号整数数组?

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

谢谢Jean的回复。有没有什么办法像这样生成数组? –

+0

甚至更​​好的是[mcve]。你的'str_split'方法丢失了,所以如果有人想为自己重现一个工作代码,他们就不能。 –

+0

他不重用我可以看到的free()'d指针。他是免费的()'char *代币[i],而不是char **代币。由于我在free()之后迭代,它是一个不同的指针。 – torstenvl

回答

1

请记住tokens是一个指针指针类型,char **tokens。因此*(tokens+i)是一个指针。你把这个指针(对一个字符串)看作是一个整数。

您需要做的是首先将字符串转换为整数类型。 strtoul()是一个很好的起点。你甚至可以指定你的基地,所以它会自动从你的十六进制转换。

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,让我试试以上 –

相关问题