tags:

views:

304

answers:

4

The string input would be

> bc <address1> <address2> length

I can break the string into tokens using strtok but not sure how to take each separate token and for example convert address1 and address 2 to 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"); 
  }
}

So far it prints the tokens but I am not sure how to use each separately.

bc
0x000FF
0x0FFF
30
A: 

Following is a sketch only.

Try

char * addresses[ 2 ];
i = 0;

Then, inside the while loop

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

Outside the loop, the input can be used by accessing the addresses[] array.

ArunSaha
+2  A: 

Use strtol to convert the numbers. The third argument is the base and the special value of 0 will tell strtol to guess based on things like "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.
Harvey
The other way to check for errors with `strtol` is to set `errno = 0;` before calling it, and checking to see whether it's zero afterwards.
caf
+1  A: 

If the format of the string is fixed and you want to convert the hex which are in position 2 and 3 into numbers you can try something like:

    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
codaddict
A: 

Hmm...I think I'd just use sscanf:

int address1, address2, num;

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

The "%*s" reads and ignores the first string (the "bc"). Each succeeding %i reads and converts one integer, using the normal C-style convention that if the number starts with "0x", it'll be converted as hexadecimal, otherwise if there's a leading "0", it'll be converted as octal, and otherwise it'll be converted as decimal.

Jerry Coffin