LINUX.ORG.RU

строка целых чисел в Си


0

0

Здравствуйте. Подскажите, как преобразовать строку вида:
char str[]="12 34 56 78";
в массив целых чисел:
int arr[n];
***
arr[0]=12
arr[1]=34
...

Длина строки неизвестна. Заранее спасибо.

anonymous

#include <stdio.h>

int* strstoi(char* str, int* nnum) {
    int* t = NULL;
    int rc, num, n = 1;

    while ((rc = sscanf(str, "%d", &num)) > 0) {
        t = realloc(t, sizeof(int)*n);
        t[n++-1] = num;
        while (isdigit(*str)) str++;
        while (isspace(*str)) str++;
    }

    *nnum = n-1;

    return t;
}

int main() {
    int i, n;
    int* a = strstoi("123 10 12 53 3", &n);

    for (i=0; i<n; i++)
        printf ("%d\n", a[i]);

    return 0;
}

Murr ★★
()
Ответ на: комментарий от Murr

#include <stdio.h>
#include <malloc.h>

main()
{
char *b = "123 0x7 0777 -256 ";
int *t = NULL, n, i;
char *s;
for(n=0;; b = s) { // b - changed
long l = strtol(b, &s, 0); // You can use 10, see man
if(b==s) break;
t = realloc(t, sizeof(int)*(n+1));
t[n++] = l;
}
for(i=0; i<n; i++) {
printf("t[%d] = %d\n", i, t[i]);
}

}

io ★★
()
Ответ на: комментарий от Murr

realloc медленный, по мне лучше посчитать кол-во пробелов и выделить сразу соответствующий кусок памяти, во первых если памяти не хватит мы об этом сразу узнаем а во вторых не будет постоянно переливать данные из пустого в порожнее

lg ★★
()
Ответ на: комментарий от anonymous

Гы. А потом выяснитс я, что пробелов между числами - произвольное кол-во , а кроме того - там же будут и табы всех видов и проч. херня. Зачем велосипед-то изобретать? sscanf все это умеет делать, причем гораздо качественнее.

Flogger_d
()
Ответ на: комментарий от Flogger_d

Так что - первый вариант более правильный. Единственное НО. Перед запуском цикла неплохо бы отпозиционироваться на начало числа - ведь не факт, что строка начинается не с пробелов. Далее - по тексту возражений нет.

Flogger_d
()
Ответ на: комментарий от Flogger_d

ну каждому свое ... если в строке хотя бы 100000 таких чисел то все умрет .. перегнать 20Tb это вам не быстрое занятие .. и еще в момент realloca() потребуется в _два_ раза больше памяти чем реально нужно .. и в конце концов когда ты прождешь три часа пока все это отработает realloc вывалится с ошибкой типа не хватает памяти батенька .. нет уж, по мне лучше написать минипарсер(даже не парсер .. две строки)

lg ★★
()
Ответ на: комментарий от lg

Ну, батенька - не надо передергивать... Когда такими объемами кидаются,
то речь явно не идет о массивах - как о непрерывных кусках памяти. В
вашем случае будет использован связный список и все неприятности с
реаллоком пропадут сами собой. Так что...

Flogger_d
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.