2012-11-07 11 views
5

Tại sao mã này có lỗi thời gian chạy?Tại sao mã này có lỗi thời gian chạy bằng cách sử dụng bản đồ có chuỗi (C++)?

#include <cstdio> 
#include <map> 
#include <string> 
#include <iostream> 

using namespace std; 
map <int, string> A; 
map <int, string>::iterator it; 

int main(){ 
    A[5]="yes"; 
    A[7]="no"; 
    it=A.lower_bound(5); 
    cout<<(*it).second<<endl; // No problem 
    printf("%s\n",(*it).second); // Run-time error 
    return 0; 
} 

Nếu bạn sử dụng cout, nó hoạt động tốt; tuy nhiên, nếu bạn sử dụng printf nó sẽ cho lỗi thời gian chạy. Làm thế nào để sửa nó? Cảm ơn!

+2

g ++ 4.6.3 phàn nàn với một thời gian biên dịch "lỗi: không thể chuyển các đối tượng thuộc loại không thể sao chép được 'struct std :: basic_string ' đến '...'". Tôi đặt cược trình biên dịch của bạn có ít nhất một cảnh báo có liên quan quá. – aschepler

Trả lời

10

Bạn đang chuyển vào một số(như bạn có thể thấy từ tài liệu trên printf, là hàm C không có lớp, hãy để một mình string). Để truy cập vào một phiên bản const của tiềm ẩn char *, sử dụng c_str chức năng:

printf("%s\n",(*it).second.c_str()); 

Ngoài ra, (*it).second tương đương với it->second, nhưng sau này là dễ dàng hơn để gõ và, theo ý kiến ​​của tôi, làm cho nó rõ ràng hơn những gì đang xảy ra.

+0

Chính xác c_str() làm gì? P.S. câu trả lời chính xác! –

+0

@DanielTalamas, 'std :: string' có thành viên dữ liệu' char * 'mà nó sử dụng để lưu trữ chuỗi. 'c_str()' trả về một hằng số, null-chấm dứt phiên bản của nó, nhưng nó chỉ hợp lệ cho đến khi hàm thành viên non-const tiếp theo được gọi. Giống như tên cho thấy, nó trích xuất một chuỗi kiểu C từ một 'std :: string'. – chris

3

Sử dụng c_str():

printf("%s\n",(*it).second.c_str()); 

printf() đang mong đợi một chuỗi C cho %s, và bạn đang đem lại cho nó một chuỗi C++ để thay thế. Vì printf() không an toàn, nên không có cách nào chẩn đoán điều này (mặc dù trình biên dịch tốt có thể cảnh báo bạn về lỗi này).

+0

Chính xác c_str() làm gì? P.S. câu trả lời hay –