มันรวบรวมเพราะprintf
ไม่ได้พิมพ์ปลอดภัยเพราะใช้ข้อโต้แย้งตัวแปรในความรู้สึก C 1 printf
ไม่มีตัวเลือกสำหรับstd::string
เฉพาะสตริง C-style การใช้สิ่งอื่นแทนสิ่งที่คาดหวังจะไม่ให้ผลลัพธ์ที่คุณต้องการ มันเป็นพฤติกรรมที่ไม่ได้กำหนดจริงๆดังนั้นทุกอย่างจะเกิดขึ้น
วิธีที่ง่ายที่สุดในการแก้ไขปัญหานี้เนื่องจากคุณใช้ C ++ คือการพิมพ์ตามปกติด้วยstd::cout
เนื่องจากstd::string
รองรับการทำงานผ่านการใช้งานเกินพิกัด:
std::cout << "Follow this command: " << myString;
หากด้วยเหตุผลบางอย่างคุณต้องแยกสตริง C-style ออกคุณสามารถใช้c_str()
วิธีการstd::string
เพื่อรับconst char *
ค่าที่ยกเลิกด้วยค่า Null ใช้ตัวอย่างของคุณ:
#include <iostream>
#include <string>
#include <stdio.h>
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.c_str()); //note the use of c_str
cin.get();
return 0;
}
ถ้าคุณต้องการฟังก์ชั่นที่ชอบprintf
แต่พิมพ์ safe ให้ดูเทมเพลต variadic (C ++ 11, รองรับกับคอมไพเลอร์หลัก ๆ ทุกตัวในฐานะ MSVC12) คุณสามารถค้นหาตัวอย่างของหนึ่งที่นี่ ไม่มีอะไรที่ฉันรู้ว่าการดำเนินการเช่นนั้นในห้องสมุดมาตรฐาน แต่อาจจะมีใน Boost boost::format
เฉพาะ
[1]: ซึ่งหมายความว่าคุณสามารถส่งผ่านจำนวนอาร์กิวเมนต์ใด ๆ ได้ แต่ฟังก์ชั่นนั้นขึ้นอยู่กับคุณที่จะบอกจำนวนและชนิดของอาร์กิวเมนต์เหล่านั้น ในกรณีที่printf
หมายถึงว่าสตริงที่มีข้อมูลที่เข้ารหัสประเภทเช่นความหมาย%d
int
หากคุณโกหกเกี่ยวกับประเภทหรือหมายเลขฟังก์ชั่นนี้ไม่มีวิธีการรู้มาตรฐานแม้ว่าคอมไพเลอร์บางตัวมีความสามารถในการตรวจสอบและให้คำเตือนเมื่อคุณนอน