0

コンマ区切りの char* を C の uint32_array[] に変換したいのですが、それを行う簡単な方法/ルーチンはありますか?

私はすでに SO に多くの時間を費やしており、C++ で多くの解決策を見つけましたが、そのような C ではありません: コンマ区切りの std::string の解析ベクトルにストリーミングし、ベクトルを操作します。

char input[] = "1 , 2 , 34, 12, 46, 100";

uint32_t output[] = { 1 , 2 , 34, 12, 46, 100 };

あらゆる種類の助けをいただければ幸いです。どうもありがとう。

4

7 に答える 7

1

これは、単一のパスのみを作成する再帰アルゴリズムです。最も深いレベルで割り当て、途中で埋めます。

int *cvt(char *input, int *level)
{
    char *cp = strtok(input, ", ");
    if (cp == NULL) {
        /* No more separators */
        return (int *) malloc(sizeof(int) * *level);
    }

    int my_index = -1;
    int n;
    if (sscanf(cp, "%d", &n) == 1) {
        my_index = *level;
        *level += 1;
    } else {
        printf("Invalid integer token '%s'\n", cp);
    }
    int *array = cvt(NULL, level);
    if (my_index >= 0) {
        array[my_index] = n;
    }
    return array;
}

電話:

int main(int ac, char **av)
{
    char input[] = "1, 2, bogus, 4, 8, 22, 33, 55";
    int n_array = 0;
    int *array = cvt(input, &n_array);

    int i;
    printf("Got %d members:\n", n_array);
    for (i = 0; i < n_array; ++i)
        printf("%d ", array[i]);
    printf("\n");

    return 0;
}
于 2015-05-21T20:00:26.293 に答える
1

リングに脱帽して、データの 1 回のパスを実行します。必要な配列サイズは、すべてのデータが「n」の形式である最悪のケースであると見積もっているため、数値ごとに 2 バイトであり、後でサイズを変更します。

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

typedef unsigned int uint32_t;

int main (void) {
    char input[] = "1 , 2 , 34, 12, 46, 100";
    uint32_t *output, *temp;
    char *tok;
    int elements = 0;
    int len = 1 + strlen(input) / 2;            // estimate max num of elements
    output = malloc(len * sizeof(*output));
    if (output == NULL)
        exit(-1);                               // memory alloc error

    tok = strtok(input, ", ");                  // parse the string
    while (tok != NULL) {
        if (elements >= len)
            exit(-2);                           // error in length assumption
        if (1 != sscanf(tok, "%u", output + elements))
            exit(-3);                           // error in string format
        elements++;
        tok = strtok(NULL, ", ");
    }

    temp = realloc(output, elements * sizeof(*output)); // resize the array
    if (temp == NULL)
        exit(-4);                               // error in reallocating memory
    output = temp;

    for (len=0; len<elements; len++)
        printf("%u ", output[len]);
    printf("\n");
    free(output);
    return 0;
}

プログラム出力:

1 2 34 12 46 100
于 2015-05-21T20:07:46.597 に答える