0

这个例子的输出是......

HC:\Projects\cppexample.exeello 世界。

为什么当前可执行文件的路径被推送到字符串中?

#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;
    }
4

4 回答 4

3

string在调用之前没有空终止字符,wcscat()并且wcscat()要求目标字符串为空终止:

strDestination
    以 Null 结尾的目标字符串。

改成:

TCHAR string[255] = TEXT("");
string[0]=TEXT('H');

或者:

TCHAR string[255] = TEXT("H");

或者:

TCHAR string[255];
string[0]=TEXT('H');
string[0]=TEXT('\0');
于 2012-08-01T13:55:42.810 回答
2

因为您没有以空字节结束“字符串”“H”。因此wcscat附加到它在您的(未初始化的)数组中找到第一个空字节的位置,该数组恰好包含可执行路径(以及之前的一个字节)。

于 2012-08-01T13:54:38.157 回答
1

您需要使用 终止字符串数组'\0'。更新代码之类的。

string[0]=TEXT('H');
string[1]=TEXT('\0');
于 2012-08-01T13:56:28.250 回答
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
以 Null 结尾的目标字符串。
strSource 以
Null 结尾的源字符串。
count
要追加的字符数。

于 2012-08-01T14:19:34.143 回答