Domanda

Utilizzando solo lo standard ANSI C, qual è il modo migliore per, con certezza fiera, determinare se un C stile stringa è un numero intero o un numero reale (io.e float/double)?

È stato utile?

Soluzione

Non utilizzare atoi e atof come queste funzioni restituiscono 0 in caso di errore.L'ultima volta che ho controllato 0 è un valido integer e float, quindi non utilizzare per la determinazione del tipo.

utilizzare il strto{l,ul,ull,ll), d} funzioni, tali da impostare errno in caso di errore, e anche la relazione in cui i dati convertiti chiuso.

strtoul: http://www.opengroup.org/onlinepubs/007908799/xsh/strtoul.html

in questo esempio si presuppone che la stringa contiene un singolo valore da convertire.

#include <errno.h>

char* to_convert = "some string";
char* p = to_convert;
errno = 0;
unsigned long val = strtoul(to_convert, &p, 10);
if (errno != 0)
    // conversion failed (EINVAL, ERANGE)
if (to_convert == p)
    // conversion failed (no characters consumed)
if (*p != 0)
    // conversion failed (trailing data)

Grazie a Jonathan Leffler per precisare che ho dimenticato di impostare errno a 0 il primo.

Altri suggerimenti

Utilizzando sscanf, si può essere certi se la stringa è un float o int o qualunque cosa senza dover caso speciale 0, come è il caso con atoi e atof soluzione.

Ecco qualche esempio di codice:

int i;
float f;
if(sscanf(str, "%d", &i) != 0) //It's an int.
  ...
if(sscanf(str "%f", &f) != 0)  //It's a float.
  ...

atoi e atof convertire o restituire 0 se non è possibile.

Sono d'accordo con Patrick_O che il strto{l,ul,ull,ll), d} funzioni sono il modo migliore per andare.Ci sono un paio di punti per guardare però.

  1. Set di errno a zero prima di chiamare le funzioni;nessuna funzione che fa per voi.
  2. Il Gruppo di Aprire le pagine collegate (che sono andato prima di accorgersi che Patrick aveva collegato ad esso troppo) sottolinea che errno non può essere impostato.Esso è impostato per ERANGE se il valore è fuori misura;si può essere impostato (ma ugualmente, può non essere impostato) EINVAL se l'argomento non è valido.

A seconda del lavoro a portata di mano, io a volte organizzare per saltare più di spazio bianco finale dalla fine della conversione puntatore restituito, e poi si lamentano (reject) se l'ultimo carattere è non nullo '\0'.O posso essere sciatta e lasciare immondizia vengono ordinate, o posso accettare opzionale moltiplicatori come 'K', 'M', 'G', 'T' per kilobyte, megabyte, gigabyte, terabyte, ...o qualsiasi altro requisito in base al contesto.

Suppongo che si possa passaggio attraverso la corda e controllare se ci sono . personaggi in esso.Che è solo la prima cosa che mi è venuta in mente, però, quindi sono sicuro che ci sono altri (meglio) il modo di essere più determinati.

Utilizzare strtol/strtoll (non atoi) per controllare numeri interi.Utilizzare strtof/strtod (non atof) per verificare raddoppia.

atoi e atof convertire la parte iniziale della stringa, ma non dice se non si è della stringa.strtol/strtod dirti se c'era extra spazzatura dopo i caratteri convertiti.

Quindi, in entrambi i casi, ricordarsi di passare in un non-null CODA parametro, e controllare che indica la fine della stringa (che è, **TAIL == 0).Anche controllare il valore di ritorno per underflow e overflow (vedere le pagine man o standard ANSI per i dettagli).

Nota anche che strod/strtol saltare iniziale spazi vuoti, in modo che, se si vuole trattare le stringhe con iniziale gli spazi come mal formattato, è inoltre necessario controllare il primo carattere.

Dipende perché si richiede, in primo luogo.

Se si desidera solo per analizzare un numero e non so se è un galleggiante o di un intero, quindi basta analizzare un float, sarà analizzare correttamente un numero intero, come pure.

Se si vuole realmente conoscere il tipo, forse per la valutazione, allora si dovrebbe davvero prendere in considerazione i tipi di test nell'ordine che si ritengono più rilevanti.Come tenta di analizzare un numero intero e se non è possibile, allora tenta di analizzare un galleggiante.(L'altro modo intorno produrrà solo un po ' più galleggianti...)

atoi e atof convertire il numero, anche se ci sono finali non caratteri numerici.Tuttavia, se si utilizza strtol e strtod non solo saltare leader spazio bianco e un segno (opzionale, ma lasciamo con un puntatore al primo carattere non il numero.Quindi è possibile controllare che il resto è spazio.

Beh, se non avete voglia di utilizzare una nuova funzione come strtoul, si potrebbe aggiungere un altro strcmp istruzione per vedere se la stringa è 0.

cioè

if(atof(token) != NULL || strcmp(token, "0") == 0)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top