Ignorando todo lo que no sean enteros scanf

Me gustaría tomar una matriz de enteros como una entrada. Incluso si alguien ingresa a un espacio o un alfabeto alpino, quiero ignorarlo.

int i=0; while(L--){ scanf("%d",&arr[i++]); } 

Pero si ingreso: 4 wtf el arr[0] se inicializa a 4 y el bucle termina. ¿Hay alguna manera de ignorar todo después de un espacio en scanf y simplemente tomar los enteros? La entrada puede ser de forma: 4 abc 3 def 7 ghi .

Pienso así?

 int a; scanf("%d %*s", &a); printf("%d\n",a); 

Y

 input: 11 wwwww output: 11 

El * se usa para omitir una entrada sin ponerla en ninguna variable.

Prueba esto

 while(L--){ scanf("%d",&arr[i++]); while(getchar() != '\n'); // Consumes all characters after space. } 

Puede usar fgets para obtener la cadena de entrada de la entrada stdin y luego usar sscanf para filtrar el número entero de la cadena de entrada.

 char input[50]; int num; fgets(input, 50, stdin); sscanf(input, "%d %*s", &num); 

El %*s rechaza la cadena después del entero encontrado.

Creo que lo que realmente te gustaría lograr aquí es extraer todos los números de una entrada aleatoria. Propongo usar fgets para leer la entrada en un búfer y luego, usando isdigit y strtol , extraiga los números:

 #include  int main(void) { char buff[255] = {0}; fgets(buff, sizeof(buff), stdin); // read data from stdin char *ptr = buff; do { if(!isdigit(*ptr)) // check if current character is a digit continue; // if not... long val = strtol(ptr, &ptr, 10); // read a number printf("%ld\n", val); // print it } while(*ptr++); // ...move to next character } 

… y la prueba rápida:

 [root@dmudms01 temp]# ./a.out 1abc23 **4 1 23 4