2013-06-09 30 views
6
void displayinfo(string &filename) 
{ 
printf("%s% 38s\n", "Filename:", filename); 
... 

Cảnh báo: Đối tượng không phải POD loại "std :: string" được chuyển thành đối số biến để hoạt động "std :: printf (const char *, ...)".C++ cảnh báo không phải POD để chuyển một chuỗi?

Không có gì trực tuyến giải thích ý nghĩa của cảnh báo đó.

Làm thế nào tôi sẽ nhận được printf viết này (giả sử filename = test.txt):

Tên tập tin: (phải biện minh cho tên tập tin) test.txt

Cảm ơn trước.

Trả lời

9

Giải thích khá đơn giản: chỉ POD (cấu trúc dữ liệu cũ thuần túy) có thể được chuyển thành đối số cho hàm variadic (không phải hàm variadic mẫu, chỉ đơn giản là hàm variadic sử dụng dấu ba chấm).

std::string không phải là một POD, nhưng bạn có thể làm:

printf("%s% 38s\n", "Filename:", filename.c_str()); 
//          ^^^^^^^^ 

Các c_str() member function lợi nhuận một const char* vào chuỗi C đóng gói.

+0

Nhờ cả hai câu trả lời. – user2369405

+0

@ user2369405: Vui vì nó đã giúp –

3

printf, khi được sử dụng với định dạng số %s, yêu cầu trỏ đến char. Bạn có thể nhận được rằng từ một std::string thông qua phương thức c_str():

printf("%s% 38s\n", "Filename:", filename.c_str()); 

Là một sang một bên, lưu ý rằng nếu bạn không có ý định để sửa đổi hoặc sao chép các chuỗi đầu vào, bạn nên đi qua const tham khảo:

void displayinfo(const string& filename) { .... } 
0

Tôi nghiêm túc nghi ngờ mạng sẽ im lặng. Có thể bạn đã nhìn vào những nơi sai hoặc sử dụng nad keyworrs.

Quy tắc cơ bản rất đơn giản, chuyển đối số không POD dưới dạng ... là hành vi không xác định. Đừng làm điều đó trừ khi thực hiện của bạn xác định một số hành vi và nó phù hợp với nhiệm vụ của bạn.

Và đặc biệt đối với gia đình printf, có chuỗi định dạng yêu cầu loại cụ thể để vượt qua, bạn đã phá vỡ ngay cả khi truyền POD hoạt động.

Các vấn đề liên quan