Fihop - 1 year ago 86
C Question

# Reverse every word in a string (should handle space)

Examples:

``````char test1[] = "               ";
char test2[] = "   hello  z";
char test3[] = "hello world   ";
char test4[] = "x y z ";
``````

Results:

``````"               "
"   olleh  z"
"olleh dlrow   "
"x y z "
``````

The problem:

Reverse every world in a string, ignore the spaces.

The following is my code. The basic idea is to scan the string, when
finding a word, then reverse it. The complexity of the algorithm is
O(n), where n is the length of the string.

How do verify it? Is there a better solution?

``````void reverse_word(char* s, char* e)
{
while (s < e)
{
char tmp = *s;
*s = *e;
*e = tmp;
++s;
--e;
}
}

char* word_start_index(char* p)
{
while ((*p != '\0') && (*p == ' '))
{
++p;
}

if (*p == '\0')
return NULL;
else
return p;
}

char* word_end_index(char* p)
{
while ((*p != '\0') && (*p != ' '))
{
++p;
}

return p-1;
}

void reverse_string(char* s)
{
char* s_w = NULL;
char* e_w = NULL;
char* runner = s;

while (*runner != '\0')
{
char* cur_word_s = word_start_index(runner);
if (cur_word_s == NULL)
break;
char* cur_word_e = word_end_index(cur_word_s);
reverse_word(cur_word_s, cur_word_e);
runner = cur_word_e+1;
}
}
``````

Your code seems correct, but it's plain C. In C++, using the same approach, it could look something like this:

``````#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
#include <cctype>

int main()
{
std::string str = "    cat cow dog wolf     lobster";
std::string result;
auto it = str.begin();

while (it != str.end()) {

while (it != str.end() && isspace(*it)) {
result += *it;
++it;
}

auto begin = it;
while (it != str.end() && !isspace(*it)) {
++it;
}
auto end = it;

result.append(std::reverse_iterator<decltype(end)>(end),
std::reverse_iterator<decltype(begin)>(begin));

// if you want to modify original string instead, just do this:
std::reverse(begin, end);
}

std::cout << result <<'\n';
}
``````
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download