1

字符串输入将是

> bc <address1> <address2> length

strtok我可以使用但不确定如何获取每个单独的标记将字符串分解为标记,例如将地址 1 和地址 2 转换为十六进制。

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
4

4 回答 4

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.
于 2010-03-07T04:37:49.570 回答
1

如果字符串的格式是fixed并且您想将位置的十六进制转换23数字,您可以尝试以下操作:

    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
于 2010-03-07T04:42:16.500 回答
0

以下仅为草图。

尝试

char * addresses[ 2 ];
i = 0;

然后,在while循环内

strncpy( addresses[ i ], *tkn, , MAX_TOKEN_LENGTH );
++i;

在循环之外,可以通过访问addresses[] 数组来使用输入。

于 2010-03-07T04:37:33.710 回答
0

嗯...我想我会使用 sscanf:

int address1, address2, num;

sscanf(input_string, "%*s %i %i %i", &address1, &address2, &num);

“%*s”读取并忽略第一个字符串(“bc”)。随后的每个 %i 读取并转换一个整数,使用正常的 C 样式约定,如果数字以“0x”开头,它将被转换为十六进制,否则如果有前导“0”,它将被转换为八进制,否则将转换为十进制。

于 2010-03-07T05:08:05.823 回答