Usa la famiglia di funzioni std::stod in C++

Jinku Hu 12 ottobre 2023
Usa la famiglia di funzioni std::stod in C++

Questo articolo spiega e dimostra diversi metodi su come utilizzare la famiglia di funzioni std::stod in C++.

Usa std::stod per convertire una string in un valore in virgola mobile in C++

La funzione std::stod insieme a std::stof e std::stold sono fornite da STL per eseguire una conversione da stringa a virgola mobile. Nota che diciamo conversione, ma è più simile a un’interpretazione del contenuto della stringa come un valore a virgola mobile. Vale a dire, queste funzioni scansionano gli argomenti stringa dati con regole di analisi predefinite per identificare i numeri a virgola mobile validi e memorizzarli nell’oggetto di tipo corrispondente.

Le funzioni sono differenziate dal suffisso, che indica il tipo da esse restituito. L’oggetto std::stod restituisce il valore double, std::stof restituisce un float e std::stold restituisce long double. Queste funzioni fanno parte di STL dal C++ 11 e sono incluse nel file di intestazione <string>.

Nei seguenti frammenti di codice di seguito, esploreremo diversi scenari di conversione e approfondiremo le regole di analisi di queste funzioni. Il primo esempio è il caso più semplice in cui l’oggetto stringa include solo cifre e delimitatore decimale (.). La funzione std::stod interpreta le sequenze di caratteri date come numeri a virgola mobile validi e le memorizza in un tipo double. Si noti che il delimitatore decimale non può essere il carattere virgola (,) poiché non verrà considerato come parte del numero.

#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::string;

int main() {
  string str1 = "123.0";
  string str2 = "0.123";

  auto m1 = std::stod(str1);
  auto m2 = std::stod(str2);

  cout << "std::stod(\"" << str1 << "\") is " << m1 << endl;
  cout << "std::stod(\"" << str2 << "\") is " << m2 << endl;

  return EXIT_SUCCESS;
}

Produzione:

std::stod("123.0") is 123 std::stod("0.123") is 0.123

In alternativa, se abbiamo oggetti stringa in cui le cifre sono mescolate con altri caratteri, si possono individuare due casi comuni. Il primo scenario: l’oggetto stringa inizia con cifre seguite dagli altri caratteri; la funzione std::stod estrae le cifre iniziali prima che venga incontrato il primo carattere non numerico (escluso il delimitatore decimale).

Il secondo scenario: l’argomento stringa inizia con caratteri non numerici, nel qual caso la funzione genera l’eccezione std::invalid_argument e non è in grado di condurre la conversione.

#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::string;

int main() {
  string str3 = "123.4 with chars";
  string str4 = "chars 1.2";

  auto m3 = std::stod(str3);
  //    auto m4 = std::stod(str4);

  cout << "std::stod(\"" << str3 << "\") is " << m3 << endl;

  return EXIT_SUCCESS;
}

Produzione:

std::stod("123.0") is 123 std::stod("0.123") is 0.123

In genere, std::stod e la sua famiglia di funzioni scartano i caratteri di spaziatura iniziali. Quindi, se passiamo una stringa con più spazi iniziali seguiti dalle cifre, la conversione verrà eseguita correttamente, come dimostrato nell’esempio seguente.

Inoltre, queste funzioni possono prendere un argomento opzionale del tipo size_t*, che memorizzerà il numero di caratteri elaborati se la chiamata ha esito positivo. Si noti che i caratteri di spaziatura iniziali contano anche se la stringa viene convertita nel numero a virgola mobile valido.

#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::string;

int main() {
  string str3 = "123.4 with chars";
  string str5 = "           123.4";

  size_t ptr1 = -1;
  size_t ptr2 = -1;

  auto m4 = std::stod(str3, &ptr1);
  auto m5 = std::stod(str5, &ptr2);

  cout << m4 << " - characters processed: " << ptr1 << endl;
  cout << "std::stod(\"" << str5 << "\") is " << m5 << " - " << ptr2
       << " characters processed" << endl;
  cout << "length: " << str5.size() << endl;

  return EXIT_SUCCESS;
}

Produzione:

123.4 - characters processed : 5 std::stod("           123.4") is 123.4 -
    16 characters processed length : 16
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Articolo correlato - C++ Function