c++ 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不喜欢我的"label"因为它是一个数组函数是这样调用的

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());
    //...
}

{Edit}

当你想使用函数模板时,你必须匹配所有的形参类型。因此,您必须将字符串的长度而不是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参数指向一个输出变量,因此需要将该变量的大小作为附加参数。例如:

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());
    //...
}

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() );

try with this

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/

相关内容

  • 没有找到相关文章

最新更新