I'm a beginner and I've been going through a book on C++, and I'm on a chapter on functions. I wrote one to reverse a string, return a copy of it to main and output it.
string reverseInput(string input);
int main()
{
string input="Test string";
//cin>>input;
cout<<reverseInput(input);
return 0;
}
string reverseInput(string input)
{
string reverse=input;
int count=input.length();
for(int i=input.length(), j=0; i>=0; i--, j++){
reverse[j]=input[i-1];
}
return reverse;
}
The above seems to work. The problem occurs when I change the following code:
string input="Test string";
to:
string input;
cin>>input;
After this change, the reverse function returns only the reverse of the first inputted word, instead of the entire string. I can't figure out where I am going wrong.
Lastly, is there a more elegant way of doing this by using references, without making a copy of the input, so that the input variable itself is modified?
The problem is with cin
. It stops reading after the first space character is read.
See the "cin and strings" section of this tutorial: http://www.cplusplus.com/doc/tutorial/basic_io/
You can use getline(cin, input);
to do what you want.
cin>>input;
reads a word, not a line.
Use e.g. getline(cin, input);
to read a line
cin >> input
reads a word. To read an entire line you should use getline
getline(cin, input);
A debugger is very useful in this cases, you can just see the values of the variables stepping through the program.
A simple cout << input; would have helped you too but if you still don't have a good IDE with integrate debugger I would suggest you to use one. Eclipse is good and open source. Visual studio 2010 express is good and free if you are on windows.
Try this: istream& getline ( istream& is, string& str );
It takes an entire line from a stream you give, e.g. cin
and saves it into a string
variable. Example:
getline(cin, input);
cin.getline(...)
would work on C-style character buffers.
Inplace reverse function was already answered in detail here:
How do you reverse a string in place in C or C++?
The problem with your code is that std::cin
reads character till it encounters a character for which std::isspace(c)
returns true
. So spaces and newlines are all such characters which returns true
when passing to std::isspace
.
So what you need basically is, std::getline
:
std::string input;
if ( std::getline(std::cin, input))
{
std::cout << reverseInput(input);
}
else
{
std::cout <<"error while reading from standard input stream";
}
As for your question about references and copying:
string& reverseInput(string& input)
{
for (i = 0, j = input.length()-1; i < j; i++, j--)
{
char c = input[i];
input[i] = input[j];
input[j] = c;
}
return input;
}
You pass your argument as reference, and you return a reference. No copying involved, and in a body, you don't define any new string, you are working on the same instance.
This is not an error in your reverse function, but the standard behaviour of istream::operator>>
, which only reads until the first whitespace character.
You need to use cin.getline(), cin >> s will only read the first word (delimited by space)