Rumah >pembangunan bahagian belakang >C++ >Mengapakah `atof` Mengembalikan Sifar Apabila Menukar `std::string` kepada `double`?

Mengapakah `atof` Mengembalikan Sifar Apabila Menukar `std::string` kepada `double`?

Barbara Streisand
Barbara Streisandasal
2024-12-02 16:02:12774semak imbas

Why Does `atof` Return Zero When Converting a `std::string` to `double`?

Masalah Menukar daripada std::string kepada double Menggunakan atof?

Apabila cuba menukar std::string kepada jenis floating-point seperti float atau double menggunakan fungsi atof, anda mungkin menghadapi hasil yang tidak dijangka. Berikut ialah isu biasa dan penyelesaiannya:

Isu: Penukaran Sifar

std::string num = "0.6";
double temp = (double)atof(num.c_str());

Dalam kod di atas, fungsi atof mengembalikan sifar dan bukannya nilai jangkaan 0.6. Ini berlaku kerana atof ialah fungsi C yang mengharapkan rentetan gaya C (char *) sebagai hujahnya. Walau bagaimanapun, num.c_str() mengembalikan penuding kepada aksara pertama dalam objek std::string, iaitu jenis objek.

Penyelesaian

Untuk menyelesaikan isu ini, anda harus lulus Rentetan gaya C terus ke atof. Berikut ialah kod yang diperbetulkan:

std::string num = "0.6";
double temp = ::atof(num.c_str());

Tanda bertindih berganda (::) sebelum atof menunjukkan bahawa fungsi atof ialah fungsi global yang diisytiharkan dalam ruang nama std.

Alternatif

Walaupun penyelesaian di atas menggunakan atof adalah sah, perlu diingat bahawa terdapat kaedah alternatif yang mungkin memberikan fungsi tambahan atau faedah prestasi. Contohnya:

  • stringstream: Ini menyediakan antara muka berasaskan strim untuk menukar antara jenis rentetan dan angka.
  • boost::lexical_cast: Pustaka ini menyediakan cara yang lebih selamat jenis untuk melakukan rentetan penukaran.

Walau bagaimanapun, adalah penting untuk menilai implikasi prestasi kaedah alternatif ini, kerana ia mungkin datang dengan overhed tambahan berbanding menggunakan atof.

Nota untuk Pengguna Qt

Jika projek anda menggunakan rangka kerja Qt, anda boleh memanfaatkan kaedah QByteArray::toDouble terbina dalam. Ia biasanya lebih pantas untuk menukar daripada data const char* daripada menggunakan std::stringstream.

QString winOpacity("0.6");
double temp = winOpacity.toDouble();

Atas ialah kandungan terperinci Mengapakah `atof` Mengembalikan Sifar Apabila Menukar `std::string` kepada `double`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn