2017-09-27 1 views
0

나는 스크립트에 전달되는 인수에서스크립트에 전달 된 인수에서 부호없는 정수 배열을 만드는 방법은 무엇입니까?

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

}

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; 

같은 부호없는 정수 배열을 작성해야합니다. 인수가

./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() 포인터를 다시 사용하지 않습니다. 그는 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, 위의 시도하자 –

관련 문제