2010-06-19 54 views
18

Sau khi lướt web và làm rối tung xung quanh bản thân mình, tôi không thể chuyển đổi mục tiêu của void * thành chuỗi std ::. Tôi đã thử sử dụng sprintf(buffer, "%p", *((int *)point)); theo đề nghị của this page để nhận được một chuỗi C, nhưng không có kết quả. Và thật đáng buồn, phải, tôi phải sử dụng một khoảng trống *, vì đó là những gì SDL sử dụng trong cấu trúc USEREVENT của họ.Chuyển đổi một void * thành std :: string

Mã Tôi đang sử dụng để lấp đầy Userevent, cho những người quan tâm, đó là:

std::string filename = "ResumeButton.png"; 
SDL_Event button_press; 
button_press.type = BUTTON_PRESS; 
button_press.user.data1 = &filename; 
SDL_PushEvent(&button_press); 

Bất kỳ ý tưởng?

CHỈNH SỬA: Cảm ơn tất cả các câu trả lời, tôi chỉ cần bỏ khoảng trống * thành chuỗi std :: string *. Tôi ngớ ngẩn quá. Cảm ơn các bạn rất nhiều!

+1

STL, USEREVENT trong STL là gì? C++ không có thứ gì như vậy. – GManNickG

+1

Bạn đang cố gắng làm gì? Bạn có một con trỏ void * trỏ đến gì? –

+0

Tôi nghĩ rằng anh ta có nghĩa là SDL UserEvent http://linux.die.net/man/3/sdl_userevent – Stephen

Trả lời

16

Bạn chỉ cần để tự động phân bổ nó (vì nó có lẽ cần phải sống lâu hơn phạm vi bạn đang sử dụng nó trong), sau đó quăng nó qua lại:

// Cast a dynamically allocated string to 'void*'. 
void *vp = static_cast<void*>(new std::string("it's easy to break stuff like this!")); 

// Then, in the function that's using the UserEvent: 
// Cast it back to a string pointer. 
std::string *sp = static_cast<std::string*>(vp); 
// You could use 'sp' directly, or this, which does a copy. 
std::string s = *sp; 
// Don't forget to destroy the memory that you've allocated. 
delete sp; 
+0

Chính xác những gì tôi đang tìm kiếm. Cảm ơn! – Lewis

+0

Lưu ý rằng câu trả lời này có một cạnh hơn (các) khác, vì nó ngăn cản mục tiêu của con trỏ ra khỏi phạm vi. Cảm ơn một lần nữa! – Lewis

4

Nếu bạn cố gắng để định dạng địa chỉ dưới dạng văn bản, bạn có thể sử dụng một stringstream:

std::stringstream strm; 
strm << ptr; 
std::string str = strm.str(); 

// str will now have something like "0x80004567" 

Nếu đó không phải là những gì bạn quan tâm, xin vui lòng làm rõ câu hỏi của bạn.

+0

Xin lỗi, tôi không rõ ràng chút nào. Những gì tôi có nghĩa là để chuyển đổi những gì void * trỏ đến (đó là một chuỗi) vào một chuỗi. – Lewis

+0

I * đã * cố gắng làm điều đó - cảm ơn! (Mod Up) – Brad

7

Dựa trên nhận xét của bạn "Ý của tôi là chuyển đổi những gì void * trỏ đến (là một chuỗi) thành chuỗi."

Giả sử bạn có điều này:

std::string str = ...; 
void *ptr = &str; 

Bạn chỉ có thể đúc lại chuỗi:

std::string *pstr = static_cast<std::string *>(ptr); 

Lưu ý rằng nó là vào bạn để xác minh rằng ptr thực trỏ đến một std::string. Nếu bạn nhầm lẫn và nó trỏ đến một thứ khác, điều này sẽ gây ra hành vi không xác định.

+0

Đây chính xác là những gì tôi đang tìm kiếm. Cám ơn rất nhiều! – Lewis

1

Nếu khoảng trống là một const char * , sau đó bạn chỉ có thể gọi std :: string constructor với nó, tức là

const char* cakes = something; 
std::string lols = std::string(cakes); 
+0

Thông thường, bạn có thể không giả định điều này, vì vậy đề xuất của bạn có thể dẫn đến vi phạm phân đoạn. Vui lòng xem xét xóa nó. – einpoklum

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