2013-04-02 36 views
2

有一行字符串和一行文本。比方說:在純c中的字符串(char *)中查找int

char * line = "Foo|bar|Baz|23|25|27"; 

我將不得不找到數字。

我在想是這樣的:

  1. 如果給定一個字符是數字,讓我們把它變成一個臨時的字符數組。 (緩衝區)
  2. 如果下一個字符不是一個數字,讓我們使緩衝區成爲一個新的int。

問題是......如何找到像這樣的字符串中的數字?
(我不熟悉的C99/gcc的那麼多。)

編譯器使用:GCC 4.3(環境是一個Debian的Linux 穩定

+0

「的strcmp」 能做到這一點,有一個開關。如果char等於一個數字,我們繼續。但我不確定這是否是最好的方法。 (有一個自己的,長的函數,只是爲了檢查一個字符是否是一個數字。)@squiguy - 我會在一秒鐘內寫一個簡短的例子。 – Shiki

+0

看看isdigit()。 –

+0

@RandyHoward - 有答案。非常感謝你。 – Shiki

回答

7

我將接近如下所示:

  • 考慮到'|'作爲分隔符,標記文本行,即將行分割成多個字段。
  • 對於每一個片段:
    • 如果令牌是數字:
      • 轉換令牌的數量

一些庫函數可能是有用的是strtokisdigitatoi

2

基於sscanf,在this answer中建議的方法的一種可能的實施方式。

#include <stdio.h> 
#include <string.h> 

void find_integers(const char* p) { 
    size_t s = strlen(p)+1; 
    char buf[s]; 
    const char * p_end = p+s; 
    int n; 
    /* tokenize string */ 
    for (; p < p_end && sscanf(p, "%[^|]%n", &buf, &n); p += (n+1)) 
    { 
     int x; 
     /* try to parse an integer */ 
     if (sscanf(buf, "%d", &x)) { 
      printf("got int :) %d\n", x); 
     } 
     else { 
      printf("got str :(%s\n", buf); 
     } 
    } 
} 

int main() { 
    const char * line = "Foo|bar|Baz|23|25|27"; 
    find_integers(line); 
} 

輸出:

$ gcc test.c && ./a.out 
got str :(Foo 
got str :(bar 
got str :(Baz 
got int :) 23 
got int :) 25 
got int :) 27 
+0

謝謝,另一個很好的答案。 – Shiki