int main() { int currentNum = 20; while (!validNum(currentNum)) currentNum += 20; printf("%d\n", currentNum); return 0; }
static int getIntFromString(char c, int * dest, int * i, int base, const char * src, int * j) { if( c == cut ) { return 1; } else if( !validNum(c, base) ) { return 0; } char chr = src[(*j)++]; int ret = getIntFromString(chr, dest, i, base, src, j); if( isdigit(c) ) *dest += (c - '0') * pow(base, (*i)++); else if( isupper(c) ) *dest += (c - 'A' + 10) * pow(base, (*i)++); else *dest += (c - 'a' + 10) * pow(base, (*i)++); return ret; }
static int getInt(char c, int * dest, int * i, int base) { if( c == cut ) { return 1; } else if( !validNum(c, base) ) { return 0; } char chr = getchar(); int ret = getInt(chr, dest, i, base); if( isdigit(c) ) *dest += (c - '0') * pow(base, (*i)++); else if( isupper(c) ) *dest += (c - 'A' + 10) * pow(base, (*i)++); else *dest += (c - 'a' + 10) * pow(base, (*i)++); return ret; }
int vsscanf(const char * src, const char * fmt, va_list args) { int read = 0, i = 0, j = 0, type, state = CHAR; int sign, hasSign, base; char * str, * sdest; char c; while( fmt[i] != 0 ) { switch( state ) { case CHAR: switch( fmt[i] ) { case '%': state = PERCENTAGE; break; case ' ': default: c = src[j++]; if( c != fmt[i] ) return read; } i++; break; case PERCENTAGE: switch( fmt[i] ) { case '%': state = CHAR; c = src[j++]; if( c != fmt[i] ) return read; i++; break; case 'd': state = GETINT; type = DEC; break; case 'h': case 'x': state = GETINT; type = HEX; break; case 'o': state = GETINT; type = OCT; break; case 'c': state = GETCHAR; break; case 's': state = GETSTRING; break; default: return -1; //TODO: ERROR } break; case GETINT: base = 10; hasSign = 0; sign = 1; i++; cut = fmt[i++]; state = CHAR; c = src[j++]; switch( c ) { case '-': sign = -1; case '+': c = src[j++]; hasSign = 1; break; } if( hasSign && c == cut ) { return read; } else if( !hasSign && c == cut ) { break; } if( type == OCT || type == HEX) { if( c != '0' ) { return read; } c = src[j++]; if( type == HEX ) { if( c != 'x' ) return read; c = src[j++]; base = 16; } else base = 8; } if( !validNum(c, base) ) { return read; } else { int * dest = va_arg(args, int *); int k = 0; int ret; *dest = 0; ret = getIntFromString(c, dest, &k, base, src, &j); *dest *= sign; read++; if( !ret ) { return read; } } break; case GETCHAR: state = CHAR; c = src[j++]; if( !isgraph(c) ) return read; *va_arg(args, char *) = c; i++; read++; break; case GETSTRING: i++; cut = fmt[i++]; state = CHAR; c = src[j++]; sdest = va_arg(args, char *); str = sdest; while( c != cut && isgraph(c) ) { *(sdest++) = c; c = src[j++]; } *sdest = 0; if( (*str) ) read++; if( c != cut ) return read; break; } } return read; }
bool validTerm(const string &expr, int &L){ if (L >= expr.size()) return false; if (expr[L] == '(') return validParen(expr, L); else return validNum(expr, L); }