用sizeof替换strlen用于c-string

时间:2014-03-05 20:16:26

标签: c++ c arrays cstring

我想使用mbstowcs_s方法,但没有iostream标头。因此我不能使用strlen来预测缓冲区的大小。以下方法只需将c-string更改为宽c-string并返回:

char* changeToWide(char* value)
{
   wchar_t* vOut = new wchar_t[strlen(value)+1];
   mbstowcs_s(NULL,vOut,strlen(val)+1,val,strlen(val));
   return vOut;
}

一旦我将其更改为

char* changeToWide(char* value)
{
   wchar_t* vOut = new wchar_t[sizeof(value)];
   mbstowcs_s(NULL,vOut,sizeof(value),val,sizeof(value)-1);
   return vOut;
}

我得到错误的结果(两个数组中的值不一样)。解决这个问题的最佳方法是什么? 我也愿意接受其他想法如何在不使用字符串而是使用纯数组的情况下进行转换

2 个答案:

答案 0 :(得分:3)

给定char *或const char *,您不能使用sizeof()来获取char *变量指向的字符串的大小。在这种情况下,sizeof()将返回指针在内存中使用的字节数(通常在32位体系结构中为4个字节,在64位体系结构中为8个字节)。

如果您将字符数组定义为数组,则可以使用sizeof:

char text[] = "test";
auto size = sizeof(text); //will return you 5 because it includes the '\0' character.

但如果你有这样的事情:

char text[] = "test";
const char* ptext = text;
auto size2 = sizeof(ptext); //will return you probably 4 or 8 depending on the architecture you are working on.

答案 1 :(得分:0)

并非我是这方面的专家,但charwchar_t转换似乎只是使用更宽的空间来获得完全相同的字节,换句话说,为每个{{添加前缀char 1}}带有一些零。

我也不知道C ++,只是C,但是我可以通过查看你的代码来推导出它在C ++中的样子,所以在这里:

wchar_t * changeToWide( char* value )
{
    //counts the length of the value-array including the 0
    int i = 0;
    while ( value[i] != '\0' ) i++;

    //allocates enough much memory
    wchar_t * vOut = new wchar_t[i];

    //assigns values including the 0
    i = 0;
    while ( ( vOut[i] = 0 | value[i] ) != '\0' ) i++;

    return vOut;
}

0 |部分看起来对我来说真的过时了,但我觉得要包括它,不知道为什么......