在方法中将Unicode CString(wchar_t)转换为const char *

时间:2015-08-06 18:25:11

标签: c++ visual-studio-2013 unicode

在我的Unicode,Visual Studio 2013项目中,我尝试使用API中的此方法:

... GOpen (GCStringIn address, GCon *g)     

,其中

typedef const char *    GCStringIn
//C-string input to the library. Implies null-termination. 

如果我这样调用方法,GOpen会成功:

const CString connect = L"COM4 --baud 19200 --direct";
CT2A ascii(connect);
GOpen(ascii, &g);

但如果我这样打电话,GOpen就会失败:

const CString connect = L"COM4 --baud 19200 --direct";
GOpen(getCharPointer(connect), &g);

...

const char * getCharPointer(const CString &cstr)
{
    CT2A ascii(cstr);
    return ascii;
}

我做错了什么导致从getCharPointer方法返回的字符串无法与GOpen一起使用,我该如何修复它以便我可以在方法中进行此转换?

2 个答案:

答案 0 :(得分:2)

var topicId,
    name;
$("body").on("click", ".topic-name-edit.close", function (event) {
    topicId = $('#topicId').html();
    name = $(this).closest('header').find('input').val();
    $(this).closest('header').html('<h1 class="blue">'+name+'</h1><span class="fake-link white-grey topic-name-edit open fa fa-pencil"></span>');
    changeTopicNameService(topicId, name);
});

$("body").on("keypress", "input.topic-edit-name", function (event) {
    if (event.which == 13) {
        topicId = $('#topicId').html();
        name = $(this).closest('header').find('input').val();
        $(this).closest('header').html('<h1 class="blue">'+name+'</h1><span class="fake-link white-grey topic-name-edit open fa fa-pencil"></span>');
        changeTopicNameService(topicId, name);
    }
});

当你编写这样的代码时,问问自己:这个函数似乎返回一个指针。它会指向什么?此内存是静态的还是在免费商店中分配的?如果是前者,静态区域的大小是多少?如果是后者,那么它在代码中的确切位置是什么,它在哪里被释放?

如果你不能回答这些问题,你需要花更多时间在绘图板上。

const char * getCharPointer(const CString &cstr) 没有这些问题。始终使用std::string。当您需要将std::string向下传递给C风格的函数时,请执行以下操作:

char*

永远不要试图抓住从c_style_function(std_string_expression.c_str()); 返回的char*指针。

在这种特殊情况下,你也可以试试这个:

c_str()

如果你真的在做你发布的内容,请考虑改为

GOpen(CT2A(connect), &g);

答案 1 :(得分:2)

CT2A是一个包含char*的类。 CT2A的析构函数释放了char*指向的内存。因此,当getCharPointer()返回时,它返回的指针指向无效的内存。您需要将ascii指向的字符串复制到您拥有的内存中。最简单的方法可能是返回std::string而不是原始char*,然后您可以使用std::string::c_str()方法将其传递给GOpen()