#include
#include
using namespace std;
void reverse(char* sentence)
{
int index = strlen(sentence) - 1;
char last = \'\\0\';
When you say
index = hold;
You hav ean infinite loop. You're always going back to the point where you find your '\0' character I believe. What you should do is have two separate while loops. One to get you to the end of your character array, to find '\0'. And then another set of loops to return back to white space, then loop back forward printing out characters.
NOTE: I like all the answers presented better, but this is why the code you posted is failing. Here is a version of this function that works with just cstrings.
void reverse(char* sentence, const int START)
{
if(sentence[START] == '\0') return;
char last = '\0';
int hold = 0;
int index = START + 1;
while(sentence[index] != '\0' && sentence[index] != ' ') {//There are better ways to do this logic, but I wanted to remain true to your implementation as much as possible
index++;
}
reverse(sentence, index);
for(int j = START; j < index; j++) {
cout << sentence[j];
}
cout << endl;
return;
}
I prints out a few extra end lines, you can of course format the output however you like, the hard part is done.
I would like to use stack. 1.Tokenize the string using delimiter("") 2. push the word into the stack 3. As you pops up, store that word in the new string variable.
As the other answers suggest you should use std::string
which can save lot of hassles.
But just for the note,
void reverse(char* sentence)
{
int index = strlen(sentence) - 1,hold,last = '\0';
/*For the 1st iteration last is `\0` for all others it is ` `*/
while (index >= 0)
{
/*
In your original code,
This while loop(below) will continue to keep decrementing index
even below `0`,You wont exit this while loop until you encounter a ` `.
For the 1st word of the sentence you will never come out of the loop.
Hence the check, index>=0
*/
while (index>=0 && sentence[index] != ' ')
index--;
/* You can print the whitespace later*/
hold = index - 1; // This keeps track of the last character
// of preceding word
index++; //character after space
while (sentence[index] != last)
{
cout << sentence[index];
index++;
}
last = ' ';
index = hold;
/* Dont print space after 1st word*/
if(index > 0)
cout<<" ";
}
}
int main()
{
char* sentence = new char[256];
cin.getline(sentence, 256);
reverse(sentence);
delete[] sentence; // Delete the allocated memory
}
Tryin to keep it as close to your logic
Correction to the earlier version, firmly tongue-in-cheek :)
Note that the program reads all of stdin, treating each individual line as a 'sentence'.
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
namespace phx= boost::phoenix;
using namespace boost::spirit::qi;
int main()
{
auto out = std::ostream_iterator<std::string>(std::cout, " ");
boost::spirit::istream_iterator f(std::cin), l;
std::cin.unsetf(std::ios::skipws);
parse(f, l,
(
(as_string [ +~char_("\n\t ") ] % +char_("\t "))
[ phx::reverse(_1), phx::copy(_1, phx::ref(out)) ]
) % eol [ phx::ref(std::cout) << "\n" ]
);
}
You can do it by istringstream class of C++
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s,st,w;
int i;
getline(cin,s);
istringstream is(s);
st="";
is>>st;
while(is>>w)
{
st=w+' '+st;
}
cout<<st<<endl;
return 0;
}
Here I used splitting (tokenizing) sentence into words and then use that for reverse printing. Hope this help-
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
vector<string> split(char* str, char delimiter=' ')
{
vector<string> result;
do
{
char* begin =str;
while(*str != delimiter && *str)
str++;
result.push_back(string(begin, str));
}while(0 != *str++);
return result;
}
int main()
{
string str;
vector<string> tempStr;
cout<<"Enter The String: ";
getline(cin, str);
cout<<endl;
tempStr=split((char*)str.c_str());
str.clear();
cout<<"Final Reverse: \n";
for(int i=tempStr.size()-1; i>=0; i--) str+=tempStr.at(i)+" ";
//cout<<tempStr.at(i)<<" ";
cout<<str<<endl;
return 0;
}