Skip to content

Instantly share code, notes, and snippets.

@visuve
Created November 2, 2020 13:26
Show Gist options
  • Save visuve/51a99714242351b16464e1477b216a44 to your computer and use it in GitHub Desktop.
Save visuve/51a99714242351b16464e1477b216a44 to your computer and use it in GitHub Desktop.
Reverse a string
#include <cstdio>
#include <utility>
template <typename T, size_t N>
constexpr void Reverse(T (&str)[N])
{
constexpr size_t len = N - 2;
for (size_t i = 0, j = len; i <= j; ++i, --j)
std::swap(str[i], str[j]);
}
template <typename T>
constexpr void ReverseNullTerminated(T* str)
{
if (!str)
return;
T* left = &str[0];
T* right = &str[0];
while (right[1] != '\0')
++right;
while (left != right)
{
std::swap(*left, *right);
++left;
--right;
}
}
int main(int argc, char** argv)
{
if (argc < 2)
{
return -1;
}
char test[] = "Hello!";
Reverse(test);
puts(test);
ReverseNullTerminated(argv[1]);
puts(argv[1]);
char* test2 = "";
ReverseNullTerminated(test2);
puts(test2);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment