C'è una strtoull strtoull () in qualsiasi libreria C onnipresente?

1

Voglio una funzione che interpreterà una stringa come un intero rigorosamente senza segno, non funzionante quando la stringa trabocca, rappresenta un numero negativo o non rappresenta un numero.

strtoull() imposta errno su ERANGE su overflow o EINVAL per una stringa che non inizia con un numero, ma accetta numeri negativi come validi.

strtoumax() è uguale a strtoull()

atoll() e strtonum() sono esclusi perché sono rigorosamente per interi con segno.

sscanf() imposta errno su ERANGE in overflow e interrompe l'elaborazione della stringa se non inizia con un numero (riflesso nel valore restituito da sscanf), ma accetta anche i numeri negativi come validi.

C'è un'altra opzione che mi manca?

    
posta ShadSterling 29.07.2014 - 03:22
fonte

2 risposte

1

Non ci sono soluzioni pronte all'uso che si adattino alle tue esigenze, ma è abbastanza facile scrivere una funzione come te, usando strtoull o strtoll come base.

Per i numeri negativi, è possibile controllare preventivamente il segno meno, oppure è possibile convertire prima un numero firmato e segnalare un errore per i valori negativi.
Per i numeri seguiti da altri caratteri, puoi verificare che il puntatore endp che passi a strto(u)ll punti alla fine della stringa.

    
risposta data 29.07.2014 - 10:01
fonte
1

Stai descrivendo due problemi separati. Uno è che la stringa deve essere in una forma specifica, vale a dire tutte le cifre (ma non è stato specificato se consentire gli spazi iniziali e finali). Il secondo è che l'intervallo non dovrebbe traboccare. Non esiste una funzione prontamente disponibile che fornisca esattamente questa combinazione.

Il primo requisito è soddisfatto al meglio testando (o analizzando) la stringa prima di decodificarla. Nella maggior parte delle lingue userei un'espressione regolare. In C ++ puoi usare le funzioni di libreria. In C scrivi loop e prova caratteri.

Il secondo requisito è in realtà piuttosto complicato. È possibile includere test di overflow nella funzione di decodifica, ma testare con MAXUINT o qualcosa di simile richiede una codifica attenta. Una soluzione semplice è decodificare come un doppio e quindi testare l'intervallo prima di trasmettere a uint.

In sintesi, quando si hanno requisiti specifici come questo, normalmente si finisce di scrivere le proprie funzioni, magari basandole sul codice sorgente disponibile "libero". Negli ultimi 30 anni ho scritto codice C probabilmente ho scritto questa funzione o simili circa 5 o 6 volte. Diventa più facile con la pratica!

    
risposta data 29.07.2014 - 13:58
fonte

Leggi altre domande sui tag