Quick actions

cmd+k|ctrl+k

Navigation

Languages

Number searcher (needs refactor)

Snippet info

Language

C

Visibility

public

Author

mrsimb

Created

2017-06-18T21:08:07Z

Updated

2017-06-18T22:35:28Z

#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", &currentChar)) {
        startPtr++;
    }
    
    int numLength = 0;
    int isDouble = 0;
    int isNegative = 0;
    
    while(startPtr[0] && sscanf(startPtr, "%[-.0-9]c", &currentChar)) {
        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;
}
INFO