Jest wiele sposobów. Pokażę może jeden na prostym przykładzie:
Kod: Zaznacz cały
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define is_numeric(p) (p >= '0' && p <= '9')
int main(void)
{
char *buf = "als32amakota=32434kotmaale?kolejnyciag123";
char *num = NULL;
char *p;
size_t len;
for (p = buf, len = 0; *p; p++) {
/*
* *(p + 1) na wypadek gdyby liczby byly
* jednak na końcu ciągu
*/
if (is_numeric(*p) && *(p + 1) != '\0') {
len++;
} else if ((!is_numeric(*p) && len > 0)) {
copy:
num = strndup(p - len, len);
puts(num);
len = 0;
free(num);
} else if (len > 0) {
/*
* aktualizacja statusu zmiennych
* i skok celem skopiowania liczby
* stojącej na końcu ciągu
*/
len++;
p++;
goto copy;
}
}
}
Jeśli uważasz, że te dane z bufora nie są Ci potrzebne, to czemu nie? Możesz zmienić na białe znaki a potem użyć atoi.
Swoją drogą, zamiast wypisywać numery ASCII umieść znaki w podobny sposób w jaki ja zrobiłem to w makrze is_numeric (tj. w apostrofach).
Aha no i drobne uwagi do mojego kawałka kodu:
1. Jeśli nie potrzebujesz liczby jako stringu, rozważ pewne zmiany.
2. Jeśli nie potrzebujesz parsować tego typu ciągu - także rozważ pewne zmiany.
3. Alokacja jest wolna. Jeśli przykładowo stwierdzisz, że interesują Cie tylko liczby typu całkowitego mieszczące się w 32 bitowym typie int, rozważ zamianę jej, na kopiowanie do statycznego bufora o długości 10 znaków (2^32 ma 10 znaków w zapisie, prawda?)