在纯c中以字符串(char *)查找int

时间:2013-04-02 20:48:34

标签: c string parsing char int

有一个带有一行文字的字符串。让我们说:

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

我必须找到这些数字。

我在考虑这样的事情:

  1. 如果给定的char是一个数字,让我们将它放入一个临时的char数组中。 (缓冲区)
  2. 如果下一个字符不是数字,那么让缓冲区成为一个新的int。
  3. 问题是......如何在字符串中找到这样的数字?
    (我对C99 / gcc不太熟悉。)

    使用的编译器:gcc 4.3(环境是Debian Linux 稳定。)

2 个答案:

答案 0 :(得分:7)

我会接近以下内容:

  • 考虑'|'作为分隔符,标记文本行,即将行拆分为多个字段。
  • 对于每个令牌:
    • 如果令牌是数字:
      • 将令牌转换为数字

一些可能有用的库函数是strtokisdigitatoi

答案 1 :(得分:2)

this answer中建议的方法的一种可能实现,基于sscanf

#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