Rumah > pembangunan bahagian belakang > C++ > Mengapakah `printf` Menyebabkan Tingkah Laku Tidak Dijangka dengan `std::string`, dan Bagaimana Saya Boleh Membetulkannya?

Mengapakah `printf` Menyebabkan Tingkah Laku Tidak Dijangka dengan `std::string`, dan Bagaimana Saya Boleh Membetulkannya?

DDD
Lepaskan: 2024-12-31 13:01:11
asal
745 orang telah melayarinya

Why Does `printf` Cause Unexpected Behavior with `std::string`, and How Can I Fix It?

Memahami Penggunaan printf dengan std::string

Walaupun std::string menjadi ahli ruang nama std, percubaan untuk menggunakannya dengan printf mengakibatkan yang tidak dijangka tingkah laku, seperti yang dilihat dalam coretan kod berikut:

#include <iostream>
#include <string>

int main()
{
    using namespace std;

    string myString = "Press ENTER to quit program!";
    cout << "Come up and C++ me some time." << endl;
    printf("Follow this command: %s", myString);
    cin.get();

    return 0;
}
Salin selepas log masuk

Isu ini timbul kerana printf tidak selamat jenis dan bergantung pada rentetan gaya C. Untuk menyelesaikan masalah ini, terdapat beberapa pendekatan yang tersedia:

Menggunakan std::cout

Memandangkan std::string menyokong lebihan muatan operator, pencetakan boleh dibuat secara mudah dengan std::cout:

std::cout << "Follow this command: " << myString;
Salin selepas log masuk

Mengekstrak Rentetan gaya C

Jika mengekstrak rentetan gaya C ialah perlu, kaedah c_str() boleh digunakan untuk mendapatkan char const yang ditamatkan nol *:

printf("Follow this command: %s", myString.c_str());
Salin selepas log masuk

Menggunakan Templat Variadik

Sebagai alternatif, templat variadic boleh menyediakan alternatif selamat jenis kepada printf. Contoh pelaksanaan boleh didapati di sini: https://stackoverflow.com/a/15014001. Boost menawarkan fungsi yang serupa dengan boost::format.

C 23 Update

C 23 memperkenalkan std::print, yang menggabungkan kekuatan kedua-dua pendekatan, membolehkan keluaran selamat taip menggunakan std::format:

#include <print>

std::print("Follow this command: {}", myString);
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapakah `printf` Menyebabkan Tingkah Laku Tidak Dijangka dengan `std::string`, dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan