Nó biên dịch vì printf
không phải là loại an toàn, vì nó sử dụng đối số biến theo nghĩa C . printf
không có tùy chọn cho std::string
, chỉ có chuỗi kiểu C. Sử dụng một cái gì đó khác thay cho những gì nó mong đợi chắc chắn sẽ không cung cấp cho bạn những kết quả mà bạn muốn. Nó thực sự là hành vi không xác định, vì vậy bất cứ điều gì ở tất cả đều có thể xảy ra.
Cách đơn giản nhất để khắc phục điều này, kể từ khi bạn đang sử dụng C++, được in nó bình thường với std::cout
, vì std::string
hỗ trợ thông qua điều hành quá tải:
std::cout << "Follow this command: " << myString;
Nếu vì một lý do nào, bạn cần phải giải nén chuỗi kiểu C, bạn có thể sử dụng phương thức c_str()
của std::string
để nhận số const char *
không được chấm dứt. Sử dụng ví dụ của bạn:
#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.c_str()); //note the use of c_str
cin.get();
return 0;
}
Nếu bạn muốn có một chức năng đó là như printf
, nhưng là loại an toàn, hãy nhìn vào các mẫu variadic (C++ 11, được hỗ trợ trên tất cả các trình biên dịch lớn như của MSVC12). Bạn có thể tìm thấy một ví dụ về một số here. Không có gì tôi biết được thực hiện như vậy trong thư viện chuẩn, nhưng có thể có trong Tăng cường, cụ thể là boost::format
.
[1]: Điều này có nghĩa là bạn có thể chuyển số lượng đối số bất kỳ, nhưng hàm dựa vào số lượng và loại đối số đó. Trong trường hợp printf
, điều đó có nghĩa là một chuỗi có thông tin loại được mã hóa như %d
có nghĩa là int
. Nếu bạn nói dối về loại hoặc số, hàm không có cách thức tiêu chuẩn để biết, mặc dù một số trình biên dịch có khả năng kiểm tra và đưa ra cảnh báo khi bạn nói dối.
Chỉ để cho bạn biết, rất nhiều người [phê bình] (http://stackoverflow.com/questions/5250596/how-should-i-undo-damage-caused-by-reading-c-primer-plus) cuốn sách đó. Điều mà tôi có thể hiểu được, bởi vì không có nhiều về lập trình hướng đối tượng, nhưng tôi không nghĩ rằng nó là xấu như mọi người yêu cầu. –
ouf! tốt, nó là tốt để giữ điều này trong tâm trí trong khi tôi thực hiện theo cách của tôi thông qua cuốn sách. Tôi chắc chắn nó sẽ không phải là cuốn sách C++ duy nhất tôi sẽ đọc trong quá trình của năm tới hay như vậy, vì vậy tôi hy vọng nó không làm quá nhiều damange :) – TheDarkIn1978