Ese tipo de filtros si sabía hacerlos, pero me gustaria hacer uno sencillo para todo carácter que no sea un número positivo. Por ejemplo, imagina que el usuario introduce una arroba, un guión o un símbolo de dollar. ¿Si se pudiese hacer de manera sencilla como lo haria?
Lo que aimnotabot necesita es otro lenguaje de programación. Que tenga una funcion magica que sea inteligente y pasa de precedir cualquier input......, O espera esto es C y C++ puedes programar una funcion que haga cualquier cosa!!!!
Puedes usar todas las respuestas que ya te dieron y meterlas en una funcion creada por ti que se adapte a tus necesidades.
Realmente el C basico no hay manera facil de hacerlo, tal vez con C++ y varias de sus funciones como las que te mencionan de regex en el primero reply, podrías lograr algo mas sencillo, pero si seria de investigar un poco mas ya que hay muchas funciones "nuevas" que no conozco de C++.
Tu mejor opción sería emplear expresiones regulares (regex).
Puedes consultar la siguiente fuente donde viene bastante información...
Puedes consultar la siguiente fuente donde viene bastante información...
El mejor de los casos que seria programar una función que haga lo que quieres de una forma que tu comprendas.
Código
int i; i = funcion_leer("Ingrese un numero positivo\n",CONSTANTE_PARA_POSITIVOS);
Y por otro lado tendrias.
Código
int funcion_leer(char *s,int tipo) { int valor; int entrar_1 = 1; int entrar_2 = 1; char temporal[50]; char *ptr; do { entrar_2 = 1; do{ switch(ptr[0]) { case '\n': case '\r': //No recuardo cual de los 2 es el bueno, esto depende del sistema operativo segun recuerdo, favor de corregirme si estoy en un error case '\0': entrar_2 = 0; //Salimos por que la cadena no tiene caracteres extraños break; default: break; } }while(entrar_2);//De aqui no salimos hasta que strtol confirme que no tenemos ningun caracter raro, esto es cuando ptr apunte solo a '\r' o '\n' o '\0'; switch(tipo){ //Ahora evaluamos que el dato sea lo que buscamos case NUMERO_ENTERO: //Cualquier Numero entrar_1 = 0; break; case NUMERO_NATURAL: // > 0 if(valor > 0) { entrar_1 = 0; } break; case NUMERO_NEGATIVO: if(valor < 0) { entrar_1 = 0; } break; case NUMERO_PAR: if(valor %2 == 0) { entrar_1 = 0; } break; case NUMERO_IMPAR: if(valor % 2 == 1) { entrar_1 = 0; } break; //etc... } }while(entrar_1); return valor; }
Obviamente tienes que tener declaradas X cantidad de constantes, no es algo tan sencilla la funcion completa, pero es lo mejor validado que podrás encontrar.
Aqui esta el ejemplo de salida.

Saludos