Non si può fermare direttamente sscanf()
di fare quello che è stato progettato e specificato a che fare. Tuttavia, è possibile utilizzare una funzione poco conosciuta e raramente usati di sscanf()
per rendere più facile per scoprire che c'era 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...
Le %n
rapporti direttiva relativa al numero di caratteri consumato fino a quel momento e non conta come una conversione (quindi c'è una sola conversione in quel formato). Lo %n
è standard in sscanf()
da C89.
Per l'estrazione di un singolo intero, si potrebbe anche usare strtol()
- attenzione (rilevazione condizioni di errore con esso è sorprendentemente difficile, ma è meglio di sscanf()
che non riferirà o rilevare overflow). Tuttavia, questa tecnica può essere utilizzata più volte in un unico formato, che è spesso più conveniente.
fonte
2012-01-13 00:56:00
Vuol dire che c'è un modo per avere sscanf solo per raccogliere i caratteri numerici in una stringa del genere? Potresti anche voler chiarire se vuoi "53sd2" per restituire 53 o 532. – Ian
Scusa se dovrei essere più chiaro, voglio "14asdf" per essere riconosciuto come input non valido, come farebbe "53sd2". Voglio solo riconoscere interi che si trovano da soli (almeno delimitati da spazi) senza caratteri non numerici che li toccano. – ARW
Questo sarebbe facile in C++.Forse il tag 'C++' dovrebbe essere rimosso da questa domanda? @ AdamWathan, vuoi solo le risposte che funzionano in C? –