1

char* を wchar_t* に変換する関数を実装しようとしています。しかし、問題は、wprintf が異なる結果を示すことです。私は何を間違っていますか?

wchar_t *toWchar(char *data)
{
    if(!data)
    {
        return NULL;
    }

    int size = strlen(data);
    if(!size)
    {
        return NULL;
    }

    char *temp = (char *)malloc(size * 2);
    if(!temp)
    {
        return NULL;
    }

    int j = 0;
    for(int i = 0; i < size; i++)
    {
        temp[j++] = data[i];
        temp[j++] = '\0';
    }

    return (wchar_t *)temp;
}

編集: 主な機能:

int main()
{
    wchar_t *temp = toWchar("hello, world!");
    if(temp)
        wprintf("%ls\n", temp);
    return 0;
}
4

2 に答える 2

1

ここにいくつかの明らかな問題があります:

  1. NUL ターミネータにスペースを割り当てていません。

  2. あなたはそれwchar_tが2バイトであると仮定していますが、これは必ずしも真実ではありません. 多くの Linux システムでは、4 バイト長の UTF-32 コード単位を表す場合があります。

  3. リトルエンディアン アーキテクチャを使用していると仮定していますが、これも必ずしも正しくありません (ただし、そうである可能性は高いです)。

  4. フォーマット文字列を呼び出しwprintf()ていますが、引数が必要です。コンパイラはこれについてエラーを生成する必要があります。(( C の場合) または(C++ の場合)を追加するのを覚えていましたか?)const char*wprintf()const wchar_t*#include <wchar.h>#include <cwchar>

これがASCII入力でのみ機能することを意図していると仮定すると、次のようにしてこれらの問題を修正できます。

int size = strlen(data) + 1 /* NUL */;
...

// Allocate a wchar_t buffer directly.
// Note that the cast below is necessary in C++ but not in C.
wchar *temp = (wchar_t *)malloc(size * sizeof *temp);
...
int j = 0;
for(int i = 0; i < size; i++)
{
    temp[j++] = data[i];
}

を呼び出すときは、次wprintfを使用します。

wprintf(L"%ls\n", temp); // Note the L prefix to the string literal.

また、終わったら電話することを忘れないでくださいfree(temp)

于 2013-07-28T22:34:32.677 に答える