2

テキスト行の文字列があります。まあ言ってみれば:

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

数字を見つけなければなりません。

私は次のようなことを考えていました:

  1. 指定された char が数値の場合は、一時的な char 配列に入れましょう。(バッファ)
  2. 次の文字が数字でない場合は、バッファを新しい int にしましょう。

問題は...どうすればこのような文字列で数字を見つけることができますか?
(私は C99/gcc にあまり詳しくありません。)

使用コンパイラ: gcc 4.3 (環境は Debian Linux安定版です。)

4

2 に答える 2

7

私は次のようにアプローチします:

  • 「|」を考慮する 区切りとして、テキスト行をトークン化します。つまり、行を複数のフィールドに分割します。
  • 各トークンについて:
    • トークンが数値の場合:
      • トークンを数値に変換する

役に立つかもしれないいくつかのライブラリ関数はstrtok、、、isdigitですatoi

于 2013-04-02T20:56:22.523 に答える
2

sscanfに基づく、この回答で提案されているアプローチの可能な実装の 1 つ。

#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
于 2013-04-02T21:44:08.720 に答える