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

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

最佳答案

{编辑}

当你要使用函数模板时,你必须匹配所有的参数类型。因此,您必须将字符串的长度而不是 c_str() 结果的第二个拷贝传递给 wcsncat_s 模板:

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

这将解析为原型(prototype)

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

关于C++ wchar_t 数组到指针和函数用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14456327/

相关文章:

后台窗口的 C++ WinAPI 屏幕截图

c++ - QT-creator 中体系结构 x86_64 的 undefined symbol

jquery - 根据视口(viewport)宽度加载 jQuery

javascript - 当JS在后台运行时隐藏一个元素然后再次显示

windows - MFC中如何获取子菜单?

c++ - MFC TreeView : How to apply different images to different nodes in Treeview?

c++ - 在 C++ 中链接库

c++ - 如何否定任何单个轴上的 GLM 四元数旋转?

javascript - 从 javascript 中函数的属性返回串联字符串

c++ - CRecordset - 在 Update() 之后获取自动生成的 ID