在分配第一个索引后附加到cstring

时间:2012-08-01 13:49:08

标签: c winapi

此示例的输出是......

  

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

4 个答案:

答案 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
    空终止的源字符串。
 计数
    要追加的字符数。