此示例的输出是......
HC:\ Projects \ cppexample.exeello world。
为什么当前可执行文件的路径被推入字符串?
#ifndef UNICODE
#define UNICODE
#endif
#include <Windows.h>
int main()
{
TCHAR string[255];
string[0]=TEXT('H');
wcscat(string,TEXT("ello world"));
MessageBox(0,string,0,0);
system("Pause");
return 0;
}
答案 0 :(得分:3)
string
在调用wcscat()
之前没有空终止字符,而wcscat()
要求目标字符串为空终止:
strDestination Null-terminated destination string.
更改为:
TCHAR string[255] = TEXT("");
string[0]=TEXT('H');
或:
TCHAR string[255] = TEXT("H");
或:
TCHAR string[255];
string[0]=TEXT('H');
string[0]=TEXT('\0');
答案 1 :(得分:2)
因为你没有用空字节结束“字符串”“H”。因此wcscat
附加到它(未初始化的)数组中找到第一个空字节的位置,该数组恰好包含可执行路径(以及之前的其他内容的一个字节)。
答案 2 :(得分:1)
您需要使用'\0'
终止字符串数组。更新代码如。
string[0]=TEXT('H');
string[1]=TEXT('\0');
答案 3 :(得分:1)
你的问题:
string[0]=TEXT('H');
wcscat(string,TEXT("ello world"));
和
未初始化的TCHAR string[255];
这可以解决您的问题:
wmemset(string,TEXT('\0'), 255);
string[0]=TEXT('H');
string[1]=TEXT('\0');
wcscat(string,TEXT("ello world"));
所以,现在wcscat()会愉快地连接两个以Null结尾的字符串,“H”和“ello,World”。而不是扔掉一些垃圾值。
避免使用缓冲区安全性:
wchar_t *wcscat(
wchar_t *strDestination,
const wchar_t *strSource
);
改为使用:
wchar_t *wcsncat(
wchar_t *strDest,
const wchar_t *strSource,
size_t count
);
其中,
strDest
以空值终止的目标字符串。
strSource
空终止的源字符串。
计数
要追加的字符数。