C ++ wchar_t数组到指针和函数用法

时间:2013-01-22 10:25:26

标签: c++ function mfc wchar-t

我有以下代码:

wchar_t recordsText[64] = L"Records: ";
std::wstringstream ss2;
ss2 << c;
wcsncat_s(recordsText, ss2.str().c_str(), sizeof(ss2.str().c_str()));
((CButton*)GetDlgItem(IDC_RECORDS))->SetWindowTextW(recordsText);

它工作得很好,但是我想把它变成一个函数......没想到更容易。但我得到了一个愚蠢的错误。

我的功能是这个:

BOOL refreshTextField(CButton* item, wchar_t* label, long long* number){
    std::wstringstream ss;
    ss << number; 
    wcsncat_s(label, ss.str().c_str(), sizeof(ss.str().c_str()));
    item->SetWindowTextW(label);
    return true;
}

但是wcsncat_s不喜欢我的“标签”,因为它的数组和函数被调用如下:

refreshTextField(((CButton*)GetDlgItem(IDC_SENT_PACKAGES)), L"Packages send:  ", &sentPackages);

(顺便说一下:我知道它不应该被转换为CButton,因为它是一个编辑字段:-D,但目前无关紧要。)

问题是wchar_t数组,我不知道如何正确地将它放入我的函数中。希望你能给我一个戒烟的答案。

我已经尝试过这个:

BOOL refreshTextField(CButton* item, wchar_t** label, long long* number){
    //...
    wcsncat_s(*label, sizeof(*label), ss.str().c_str(), sizeof(ss.str().c_str()));
    //....
}

和此:

BOOL refreshTextField(CButton* item, wchar_t* label, long long* number){
    //...
wcsncat_s(label, sizeof(*label), ss.str().c_str(), sizeof(ss.str().c_str()));
    //....
}

编辑:

所以解决方案就是:

呼叫:

refreshTextField(mySelectedUIItem, L"testlabel", sizeof(L"testlabel"), 4);

功能:

BOOL refreshTextField(CButton* item, wchar_t* label, size_t lableSize, long long* number)
{
    std::wstringstream ss;
    ss << number;
    wcsncat_s(label, labelSize, ss.str().c_str(), ss.str().length());
    //...
}

3 个答案:

答案 0 :(得分:1)

<强> {编辑}

如果要使用功能模板,则必须匹配所有参数类型。因此,您必须将字符串的长度而不是c_str()结果的第二个副本传递给wcsncat_s模板:

wcsncat_s(recordsText, ss2.str().c_str(), ss2.str().length());

这将解析原型

template <size_t size>
errno_t _mbsncat_s(
   unsigned char (&strDest)[size],
   const unsigned char *strSource,
   size_t count
); // C++ only

<强> {/编辑}

没有模板,以下内容适用:

您无法将数组传递给函数。该函数只接受指针。使用函数内的指针可以很好地访问数组。但是你丢失了有关数组大小的信息。

由于指针只指向数组的第一个元素,因此无法使用

sizeof(*somePointer);

因为这会给你第一个数组元素的大小。

您需要更改refreshTextField的参数列表。由于label参数指向输出变量,因此您需要将变量的大小作为附加参数。 e.g:

BOOL refreshTextField(CButton* item, wchar_t* label, size_t lableSize, long long* number)
{
    std::wstringstream ss;
    ss << number;
    wcsncat_s(label, labelSize, ss.str().c_str(), ss.str().length());
    //...
}

答案 1 :(得分:0)

  

的sizeof(ss2.str()。c_str())

函数c_str()的结果是wchar_t*sizeof( wchar_t* )是4或8个字节(在32位或64位系统上)。您应该使用wstring::length()函数:

wcsncat_s( label, ss.str().c_str(), ss.str().length() );

答案 2 :(得分:0)

试试这个

BOOL refreshTextField(CButton* item, wchar_t[] label, long long* number){
    //...
   wcsncat_s(label, ss.str().c_str(), sizeof(ss.str().c_str()));
    //....
}

http://www.cplusplus.com/faq/sequences/arrays/sizeof-array/