【问题标题】:Find int in a string (char*) in pure c在纯c中的字符串(char *)中查找int
【发布时间】:2013-03-24 08:00:42
【问题描述】:

有一个带有一行文本的字符串。比方说:

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

我必须找到数字。

我在想这样的事情:

  1. 如果给定的 char 是一个数字,让我们把它放到一个临时的 char 数组中。 (缓冲)
  2. 如果下一个字符不是数字,让我们将缓冲区设为新的 int。

问题是...如何在这样的字符串中找到数字?
(我对 C99/gcc 不太熟悉。)

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

【问题讨论】:

  • "strcmp" 可以通过一个开关来做到这一点。如果 char 等于一个数字,我们继续。但我不确定这是否是最好的方法。 (有一个自己的长函数,只是为了检查一个字符是否是一个数字。)@squiguy - 我会在一秒钟内写一个简短的例子。
  • 看看 isdigit()。
  • @RandyHoward - 答案就出来了。非常感谢。

标签: c string parsing char int


【解决方案1】:

我会这样处理:

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

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

【讨论】:

    【解决方案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
    

    【讨论】:

    • 谢谢你,另一个很好的答案。
    猜你喜欢
    • 2012-05-03
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 2012-11-10
    相关资源
    最近更新 更多