0

我得到一个字符串,如:"aña!a¡a¿a?a"从服务器所以我解码它,然后我把它传递给一个函数。

我需要对消息做的事情是根据字母加载路径。

我的函数的标题是:void SetInfo(int num, char *descr[4])所以它接收一个数字和一个由 4 个字符(句子)组成的数组。为了使它更容易,假设我只需要使用descr [0]。

当我调试并到达 SetInfo() 时,我在调试视图中得到了确切的消息:"aña!a¡a¿a?a"所以直到这里一切正常。最初,我收到的关于该函数的信息是 std::wstring,因此我处理该消息的所有代码都使用 wstrings 和字符串,但现在我收到的是标题中所示的字符。消息到达这里还可以,但是如果我想使用它,那么我不能,因为如果我调试并查看 Descr[0] 的每个位置,那么我会得到

 descr[0][0] = 'a'; //ok
 descr[0][1] = 'Ã '; // BAD

所以我尝试使用此处找到的代码将 char* 转换为 wchar*:

 size_t size = strlen(descr[0]) + 1;
 wchar_t* wa = new wchar_t[size];
 mbstowcs(wa,descr[0],size);

但随后调试器向我展示了wa

wa wchar_t * 0x185d4be8 L"a-\uffffffff刯2e2e牵6365⽳6f73歯6f4c楲6553䈯736f獵6e6f档6946琯7361灭6569湰2e6f琀0067\021ᡰ9740슃b8\020\210=r"

我认为这是不正确的(我想我必须看到相同的初始消息"aña!a¡a¿a?a"。如果这个消息很好,那么我不知道如何得到我需要的东西......)

所以我的问题是:我怎样才能得到 descr[0][0] = 'a' 和 descr[0][1] = 'ñ' ?我不能将 char 传递给 wchar (你已经看到我得到了什么)。我做错了吗?或者还有其他方法吗?我真的坚持这一点,所以任何想法都会非常感激。

之前,当我使用 wstrings 时(而且效果很好),我正在做这样的事情:

if (word[i]==L'\x00D1' or word[i]==L'\x00F1')  // ñ or Ñ
   path ="PathOfÑ";  

其中 word[i] 在这种情况下与 descr[0][1] 相同,但使用 wstrings。所以我知道这个词[i]是字母'ñ'。也许这有助于理解我在做什么

(顺便说一句......我在 Eclipse 上工作,在 linux 上。)

4

1 回答 1

1

mbstowcs函数适用于 C 风格的字符串,而关于 C 风格的字符串的一件事是它们有一个特殊的终止字符'\0'. 您似乎没有将此终止符添加到字符串中,导致mbstowcs超出实际字符串的范围并给您未定义的行为

于 2015-09-14T15:14:16.973 回答