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);

重要的一点是,当您仍然知道数据的长度时,您需要删除 nul 字符。我们可以使用 , 轻松获取字符串文字的大小(或在我的代码中,文字的副本)sizeof,其中包括 nul 终止符。如果输入不是真正的字符串文字,而是从某个地方读取的,则您需要知道读取的数据的大小。

如果你曾经传递一个指向没有长度的数据的指针,那么你就完成了。长度一旦丢失就无法恢复。

C 没有从字符串或缓冲区中删除特定字符的标准函数。C++ 有std::remove_copy_if,但我希望这对你没用。

于 2012-05-24T18:51:20.337 回答