1
#ifndef UNICODE
#define UNICODE
#endif

#include <Windows.h>
#include <cstring>
#include <cstdio>



int main()
{
    TCHAR* greeting = L"HELL\0O W\0ORLD!";

    wprintf(L"%s\n",greeting);

    _wsystem(L"pause");
    return 0;
}

「挨拶」ですべてのヌル文字(末尾を除く)を削除する方法は? 関数をゼロから作成することは避けたいと思います。PHP の str_replace に対応する C++ を意味します。

4

2 に答える 2

7

残念ながら、

TCHAR* greeting = L"HELL\0O W\0ORLD!";

文字列の長さが失われます。ランタイムには表示されるだけです

greeting == L"HELL"; //HA!

文字列の長さを保存し、手動で文字をシフトする必要があります。

于 2012-05-24T17:04:48.750 に答える
2

このようなもの:

TCHAR greeting[] = L"HELL\0O W\0ORLD!";
TCHAR *writepos = greeting;
for (int i = 0; i < sizeof(greeting) - 1; ++i) {
    if (greeting[i] != 0) {
        *writepos++ = greeting[i];
    }
}
*writepos = 0;

wprintf(L"%s\n",greeting);

重要な点は、データの長さがわかっている場合は、ヌル文字を削除する必要があるということです。を使用して文字列リテラル (または私のコードではリテラルのコピー) のサイズを簡単に取得できsizeofます。これには nul ターミネータが含まれます。入力が実際には文字列リテラルではなく、どこかから読み取られた場合、読み取られたデータのサイズを知る必要があります。

長さのないデータへのポインタを渡したことがあれば、それで終わりです。一度失った長さは元に戻せません。

C には、文字列またはバッファーから特定の文字を削除する標準関数はありません。C++ には がありますがstd::remove_copy_if、それは役に立たないと思います。

于 2012-05-24T18:51:20.337 に答える