Nozioni di base di strtol?

Io sono molto confuso. Devo essere perso qualcosa piuttosto semplice ma non sto leggendo su strtol() è dare un senso. Qualcuno può incantesimo per me in un modo di base, nonché di dare un esempio di come potrei ottenere qualcosa come il seguente lavoro?

string input = getUserInput;
int numberinput = strtol(input,?,?);
Hai provato a stackoverflow.com/search?q=strtol ?
O cplusplus.com/reference/cstdlib/strtol ?
Una ragione particolare per l’utilizzo di strtol invece di un stringstream per leggere un numero?
Hai provato int number = strtol(input.**c_str()**, ...);?
non è necessario un stringstream quando abbiamo std::stol.

OriginaleL’autore James Thompson | 2013-02-10

4 Replies
  1. 27

    Il primo argomento è la stringa. Deve essere passato come un C string, quindi, se si dispone di un std::string utilizzare .c_str() prima.

    Il secondo parametro è opzionale e specifica un char * per memorizzare un puntatore a carattere dopo la fine del numero. Questo è utile quando si converte una stringa contenente diversi numeri interi, ma se non hai bisogno, basta impostare questo argomento è NULL.

    Il terzo argomento è la radice (base) per la conversione. strtol può fare qualsiasi cosa, da binario (base 2) a base di 36. Se si desidera strtol di scegliere la base automaticamente in base al prefisso, passare in 0.

    Modo, il più semplice utilizzo sarebbe

    long l = strtol(input.c_str(), NULL, 0);

    Se sai che sono sempre numeri decimali:

    long l = strtol(input.c_str(), NULL, 10);

    strtol restituisce 0 se non ci sono convertibili caratteri all’inizio della stringa. Se si desidera controllare se strtol riuscito, uso medio argomento:

    const char *s = input.c_str();
    char *t;
    long l = strtol(s, &t, 10);
    if(s == t) {
        /* strtol failed */
    }

    Se si utilizza C++11, utilizzare stol invece:

    long l = stol(input);

    In alternativa, si può semplicemente utilizzare un stringstream, che ha il vantaggio di essere in grado di leggere molti articoli con facilità, proprio come cin:

    stringstream ss(input);
    long l;
    ss >> l;
    Ok, quindi questo ha il mio codice di lavoro. Solo per controllare il passaggio di una stringa con nessun numero è resa che cosa esattamente? Inoltre qual è la differenza tra una stringa e una stringa di tipo C?
    Se non si dispone di un numero in una stringa, strtol restituisce 0. Dal momento che un legale valore di ritorno, è necessario utilizzare il parametro medio per disambiguare.
    Un string (std::string) è un oggetto C++ che rappresenta una stringa. È il modo migliore per gestire le stringhe in C++. Una stringa di tipo C è una sequenza di caratteri che termina con un carattere di terminazione null (\0) ed è rappresentato da un puntatore al primo carattere della sequenza (un char *). Le funzioni C (come strtol) non prendere string oggetti, quindi dovete passare un C string, invece.
    oh, non è un problema, quindi. Ho bisogno di essere in grado di catturare quando un numero non è entrato, però per il mio progetto 0 è un numero valido, quindi non posso fare un if(int = 0)
    strtol salva un puntatore al primo carattere non numerico in t. Se s==t, allora significa che il primo carattere della stringa non è numerico, cioè la stringa non iniziare con un numero.

    OriginaleL’autore nneonneo

  2. 3

    Si supponga di aver dato una stringa char const * str. Ora la conversione come questo:

    #include <cstdlib>
    #include <cerrno>
    
    char * e;
    errno = 0;
    
    long n = std::strtol(str, &e, 0);

    L’ultimo argomento 0 determina il numero di base che si desidera applicare; 0 significa “auto-detect”. Un altro ragionevole valori sono 8, 10 o 16.

    Successiva è necessario ispezionare la fine puntatore e. Questo indica il carattere dopo il consumato ingresso. Quindi se tutti gli input è stato consumato, punta a null-terminator.

    if (*e != '\0') { /* error, die */ }

    È anche possibile, per consentire un parziale di ingresso consumo e, ma questo è il genere di cose che imparerai a capire quando è effettivamente necessario.

    Infine, si dovrebbe verificare la presenza di errori, che essenzialmente può essere solo errori di overflow se l’input non è il tipo di destinazione:

    if (errno != 0) { /* error, die */ }

    In C++, potrebbe essere preferibile utilizzare std::stol, se non si arriva a scegliere il numero di base in questo caso:

    #include <string>
    
    try { long n = std::stol(str); }
    catch (std::invalid_argument const & e) { /* error */ }
    catch (std::out_of_range const & e)     { /* error */ }

    OriginaleL’autore Kerrek SB

  3. 0

    Citazione da C++ reference:

    long int strtol ( const char * str, char ** endptr, int base );

    Convertire la stringa a intero lungo

    Analizza il C string str interpretare il suo contenuto un numero intero di base specificato, che viene restituito come un long int il valore di. Se endptr non è un puntatore null, la funzione imposta il valore di endptr a punto per il primo carattere dopo il numero.

    Modo da cercare qualcosa di simile

    long l = strtol(pointerToStartOfString, NULL, 0)
    Im nuovo C++ così im non uso di puntatori, anche se ho consapevoli del concetto. Come faccio a trovare pointerToStartOfString per la mia stringa e ciò che dovrebbe essere simile
    Come funziona in C è simile a questo: char è una variabile che contiene un carattere. char* è una variabile che contiene un puntatore. Il puntatore, quando privo di riferimenti, punti per un personaggio (di solito l’inizio di molti caratteri in memoria, chiamato una ‘stringa’). Quindi, se avete char* MyPointer, allora si può fare strtol(MyPointer, NULL, 0).

    OriginaleL’autore Patashu

  4. 0

    Io uso sempre semplicemente strol(str,0,0) – restituisce un valore long. 0 per radice (l’ultimo parametro) significa auto-detect dalla stringa di input, in modo che sia 0x10 come hex e 10 come decimale può essere utilizzato nella stringa di input.

    Cercando di utilizzare strol(ingresso,0,0) mi ha dato l’errore di “impossibile convertire std::string' to const char*’ per argomento 1' to long int strtol(const char*, char**, int)'”
    Sì, il C++ è std::string che non è char*. Anche se sono utilizzati per la stessa cosa (holding stringhe) funzioni che lavorano su un non lavoro.
    per std::string uso strtol(str.c_str(),0,0)
    Vero, a proposito di 0 porta a rilevare automaticamente la base. Con “0109” il risultato è 8 8 è il rilevamento automatico di base.

    OriginaleL’autore mvp

Lascia un commento