我有以下代码:
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());
//...
}
答案 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()));
//....
}