使用strtol或strtok解析C中的字符串?

时间:2010-03-07 04:29:14

标签: c strtok

字符串输入为

> 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

4 个答案:

答案 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,并且您想要将位于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

答案 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”,它将被转换为八进制,否则它将被转换为十进制。