如何在 C 或 C++ 中反转字符串而不需要单独的缓冲区来保存反转的字符串?
原文由 uvote 发布,翻译遵循 CC BY-SA 4.0 许可协议
输入字符串,返回字符串,不需要其他库
std::string reverse_string(std::string &str)
{
const char*buf = str.c_str();
char *start = const_cast<char*>(buf);
char *end = start + strlen(buf) - 1;
char t;
while(start < end)
{
t = *start;
*start = *end;
*end = t;
start ++;
end --;
}
str = buf;
return str;
}
std::string md1 = "abcdefghijklmnopqrstuvwxyz0123456789";
std::cout << reverse_string(md1) << std::endl;
//9876543210zyxwvutsrqponmlkjihgfedcba
原文由 Driver 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
5 回答2.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
标准算法是使用指向开始/结束的指针,并将它们向内移动,直到它们在中间相遇或交叉。随走随换。
反转 ASCII 字符串,即一个以 0 结尾的数组,其中每个字符都适合 1
char
。 (或其他非多字节字符集)。相同的算法适用于已知长度的整数数组,只需使用
tail = start + length - 1
而不是结束查找循环。(编者注:这个答案最初也为这个简单的版本使用了 XOR-swap。为了这个热门问题的未来读者的利益而修复。 强烈 不推荐 XOR-swap ;难以阅读并使您的代码编译效率降低。你可以 在 Godbolt 编译器资源管理器上 看到,当使用 gcc -O3 为 x86-64 编译 xor-swap 时,asm 循环体要复杂得多。)
好的,好的,让我们修复 UTF-8 字符…
(这是异或交换的事情。请注意,您 必须避免 与 self 交换,因为如果
*p
和*q
是相同的位置,您将使用 a^a 将其归零==0。异或交换取决于有两个不同的位置,将它们分别用作临时存储。)编者注:您可以使用 tmp 变量将 SWP 替换为安全的内联函数。
例子: