#include <stdio.h>
typedef struct number number;
struct number {
double d;
int i;
int isDouble;
int isFound;
};
number findNextNumber(char *string) {
static char *startPtr;
number num = {0, 0, 0, 0};
if (!string && !startPtr) return num;
if (string) startPtr = string;
if (!startPtr[0]) return num;
char currentChar;
while(startPtr[0] && sscanf(startPtr, "%[^-.0-9]c", ¤tChar)) {
startPtr++;
}
int numLength = 0;
int isDouble = 0;
int isNegative = 0;
while(startPtr[0] && sscanf(startPtr, "%[-.0-9]c", ¤tChar)) {
if (currentChar == '-') {
if (numLength > 0) {
startPtr--;
break;
}
isNegative = 1;
}
if (currentChar == '.') {
if (isDouble) {
startPtr--;
break;
}
isDouble = 1;
}
numLength++;
startPtr++;
}
if (isNegative && numLength == 1) return num;
if (numLength == 0) return num;
char format[128];
sprintf(
format,
isDouble ? "%%%dlf" : "%%%dd",
numLength
);
num.isDouble = isDouble;
sscanf(
startPtr - numLength,
format,
isDouble ? &num.d : &num.i
);
num.isFound = 1;
return num;
}
void printNum(number num) {
if (!num.isFound) {
printf("Not found\n");
return;
}
if (num.isDouble) {
printf("%lf\n", num.d);
} else {
printf("%d\n", num.i);
}
}
int main(void) {
char* str = "abc123def-456ghi3.1459jkl-9999.999mnop";
number num = findNextNumber(str);
printNum(num);
while (num.isFound) {
num = findNextNumber(0);
printNum(num);
}
return 0;
}