1

我在 Windows x64 上使用 Eclipse 和 Visual Studio。当我通过将指针增加 1 在 Visual Studio 中打印以下字符串时,它会在 Visual Studio 中显示正确的结果。但是在 Eclipse 中,指针提前了 4 而不是 1。为什么会有这种差异?如何在eclipse中也让指针提前1?

输入字符串

[{"scaleFactor":4,"ball":{"radius":0.03999999910593033}}]

代码

unsigned char* temp = fileUtils->getFileData("levels.json", "r", &size);
wchar_t *levelData  = new wchar_t[size];
size_t len_or_error = 0;
if(size > 0) {
    const char* temp1 = reinterpret_cast<const char*>(temp);
    len_or_error = mbstowcs(&levelData[0], &temp1[0], size);
}
for(int i = 0; i < 100; i++) {
    CCLOG("i = %d | %s ", i, levelData + i);
}

输出 VS 12

i = 0 | [
i = 1 | { 
i = 2 | " 
i = 3 | s 
i = 4 | c 
i = 5 | a 
i = 6 | l 

输出日食

i = 0 | [{"scaleFactor":4,"ball":{"radius":0.03999999910593033}}]
i = 1 | caleFactor":4,"ball":{"radius":0.03999999910593033}}]
i = 2 | Factor":4,"ball":{"radius":0.03999999910593033}}]
i = 3 | or":4,"ball":{"radius":0.03999999910593033}}]
i = 4 | 4,"ball":{"radius":0.03999999910593033}}]

更新 忘了提到我在android设备上运行eclipse版本而不是在windows本身上。

更新2

在打印 wchar_t 之前添加了额外的代码。

CCLOG 是 cocos2d-x 的默认记录器https://github.com/cocos2d/cocos2d-x

4

1 回答 1

1

您遇到的问题是,wchar_t与其他编译器(如 GCC)相比,VC++ 编译器的大小不同。

Windows 使用两个字节来表示 wchar_t。您的代码在 Visual Studio 中似乎可以正常工作,因为您告诉格式字符串说明符读取一个窄字符串(一个字节)。而不是%s您应该使用%ls正确读取宽字符串。但是,我认为您真正想要做的是读取单个字符。为此,请尝试:

printf("i = %d | %lc\r\n ", i, *( levelData + i ) );

您没有指定您在 Eclipse 中使用的编译器,但 GCC(我认为是 MinGW)最多使用 4 个字节进行存储wchar_t,这就是它跳跃 4 个字节的原因。请参阅GCC 的 wchar_t 有多大?它看起来也像使用可变长度编码来存储数据。

于 2013-05-21T00:58:14.017 回答