Restricción de entrada en C

Estoy teniendo un pequeño problema al restringir la entrada del usuario. Solo quiero que los enteros 1,2 o 3 sean la entrada. Do .. while loop realiza el trabajo para entradas enteras no válidas, pero ¿cómo puedo ignorar las entradas de cadena / carácter? También necesito preguntar al usuario repetidamente si alguna vez la entrada no es válida.

Actualizar:

int problem; printf("Please select the problem that you want to solve:\n"); printf("\t 1-Problem 1\n"); printf("\t 2-Problem 2\n"); printf("\t 3-Problem 3\n"); while( scanf("%d", &problem)==0 && (problem!=1 || problem !=3 || problem !=2)) {int c; while((c=getchar())!='\n' && c!=EOF); printf("Please select the problem that you want to solve:\n"); printf("\t 1-Problem 1\n"); printf("\t 2-Problem 2\n"); printf("\t 3-Problem 3\n"); } 

Parece un poco desordenado debido a los múltiples printfs. Simplemente no quiero códigos largos en una fila. De todos modos, solo quería 1,2, o 3 como entradas. Si la entrada ingresada no es válida, el progtwig le pregunta al usuario nuevamente hasta que ingrese una entrada válida.

El código funciona para entradas no válidas, como palabras, letras, caracteres, etc. Sin embargo, si el usuario ingresa 1.2, continúa con 1, que no debería ser el caso. 0 tampoco es aceptado. ¿Qué puedo hacer con mi código para restringirlos?

scanf con un %d fallará y devolverá 0 en caso de entradas no válidas (como caracteres). Por lo tanto, solo verifique si el scanf falló al verificar el valor de retorno del mismo.

 while(scanf("%d",&num)==0 && (num<=1 || num >=3)) //Invalid input if this is true { int c; while((c=getchar())!='\n' && c!=EOF); //Clear the stdin printf("Invalid input. Try again\n"); } 

La línea

 while((c=getchar())!='\n' && c!=EOF); 

borra el flujo de entrada estándar para que scanf no lea la entrada no válida una y otra vez, dando como resultado un bucle infinito.

Tenga en cuenta que scanf puede devolver EOF . Esto hará que el progtwig piense que el usuario ha ingresado una entrada válida. Puede agregar una verificación para ver si el valor de retorno de scanf no es EOF . Además, debe inicializar num a un número que no sea 1,2 o 3 para evitar invocar un comportamiento indefinido.