2010-03-07 49 views
1

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

> 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 

回答

0

以下僅爲示意圖。

嘗試

char * addresses[ 2 ]; 
i = 0; 

然後,while循環

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

外循環內,該輸入可以通過訪問地址[]陣列中使用。

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. 
+0

使用'strtol'檢查錯誤的另一種方法是在調用它之前設置'errno = 0;',然後檢查以後是否爲零。 – caf 2010-03-07 05:20:06

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 
0

嗯...我覺得我只是用的sscanf:

int address1, address2, num; 

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

的 「%*的」 讀取和忽略第一個字符串( 「BC」)。每個成功的%i使用普通的C風格慣例讀取並轉換一個整數,如果數字以「0x」開始,它將被轉換爲十六進制,否則如果有前導「0」,它將被轉換爲八進制,否則它將被轉換爲十進制。