字符串输入为
> bc <address1> <address2> length
我可以使用strtok
将字符串分解为标记但不确定如何获取每个单独的标记,例如将address1和address 2转换为hex。
void tokenize()
{
char str[] ="bc 0xFFFF0 0xFFFFF 30";
char *tkn;
char *tkn2;
tkn = strtok (str," ");
while (tkn != NULL) {
while (*tkn != 0)
{
putchar(*tkn);
*tkn++;
}
tkn = strtok (NULL, " ");
printf("\n");
}
}
到目前为止,它打印了令牌,但我不确定如何单独使用它们。
bc
0x000FF
0x0FFF
30
答案 0 :(得分:2)
使用strtol转换数字。第三个参数是基数,0的特殊值将告诉strtol根据“0x”之类的东西进行猜测。
long num;
char s[] = "0xFFFF0";
char s2[] = "30";
num = strtol(s, &endptr, 0);
// if s==endptr, there was an error.
// if you really want to be complete, endptr - s should equal strlen("0xFFFF0")
num = strtol(s2, &endptr, 0);
// Same error checks.
答案 1 :(得分:1)
如果字符串的格式为fixed
,并且您想要将位于2
和3
的十六进制转换为数字,则可以尝试以下内容:
char str[] ="bc 0xFFFF0 0xFFFFF 30";
int count = 1;
int n1,n2;
char *tkn= strtok (str," ");
while (tkn != NULL) {
if(count == 2) { // tkn now points to a string "0xFFF0", now convert to int.
sscanf(tkn,"%x",&n1);
}
if(count == 3) {
sscanf(tkn,"%x",&n2); break;
}
tkn = strtok (NULL, " ");
count++;
}
printf("%x %x\n",n1,n2); // prints ffff0 fffff
答案 2 :(得分:0)
以下是仅草图。
尝试
char * addresses[ 2 ];
i = 0;
然后,在while循环中
strncpy( addresses[ i ], *tkn, , MAX_TOKEN_LENGTH );
++i;
在循环外部,可以通过访问addresses []数组来使用输入。
答案 3 :(得分:0)
嗯......我想我只是使用sscanf:
int address1, address2, num;
sscanf(input_string, "%*s %i %i %i", &address1, &address2, &num);
“%* s”读取并忽略第一个字符串(“bc”)。每个成功的%i读取并转换一个整数,使用正常的C风格约定,如果数字以“0x”开头,它将被转换为十六进制,否则如果有一个前导“0”,它将被转换为八进制,否则它将被转换为十进制。