No se puede parar directamente sscanf()
de hacer lo que se diseña y especifica que hacer. Sin embargo, se puede utilizar una característica poco conocida y rara vez utilizada de sscanf()
para que sea fácil de descubrir que había un problema:
int i;
if (sscanf(sInput, "%d%n", &iAssignmentMarks[0], &i) != 1)
...failed to recognize an integer...
else if (!isspace(sInput[i]) && sInput[i] != '\0')
...character after integer was not a space character (including newline) or EOS...
Los %n
informes directiva sobre el número de caracteres que consume hasta ese momento y no cuenta como una conversión (por lo que solo hay una conversión en ese formato). El %n
es estándar en sscanf()
desde C89.
Para extraer un solo entero, también puede usar strtol()
- cuidadosamente (detectar las condiciones de error con él es sorprendentemente difícil, pero es mejor que sscanf()
que no informará ni detectará desbordamientos). Sin embargo, esta técnica se puede usar varias veces en un solo formato, que a menudo es más conveniente.
¿Quieres decir que hay una forma de que sscanf solo recoja los caracteres numéricos en una cadena como esa? También es posible que desee aclarar si desea que "53sd2" devuelva 53 o 532. – Ian
Lo siento, debería ser más claro, quiero que "14asdf" se reconozca como entrada no válida, al igual que "53sd2". Solo quiero reconocer enteros independientes (al menos delimitados por espacios) sin que los caracteres que no sean dígitos los toquen. – ARW
Esto sería fácil en C++.¿Tal vez la etiqueta 'C++' debería eliminarse de esta pregunta? @AdamWathan, ¿solo quieres respuestas que funcionen en C? –