1

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?

Stéphane
  • 11,755
  • 7
  • 49
  • 63
Zubizaretta
  • 157
  • 1
  • 9
  • Your reverse function has a bug in it. You should use `i>0` for the `for` condition. On the last iteration `i==0` and `j==input.length()` resulting in `reverse[input.length()]=input[-1]`, both of which are out of bounds. – IronMensan Nov 08 '11 at 14:57

9 Answers9

7

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.

Polynomial
  • 27,674
  • 12
  • 80
  • 107
4

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.

Salvatore Previti
  • 8,956
  • 31
  • 37
4

cin>>input; reads a word, not a line.

Use e.g. getline(cin, input); to read a line

nos
  • 223,662
  • 58
  • 417
  • 506
2

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.

Vlad
  • 18,195
  • 4
  • 41
  • 71
1

Inplace reverse function was already answered in detail here:

How do you reverse a string in place in C or C++?

Community
  • 1
  • 1
pointer
  • 579
  • 3
  • 5
1

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";
}
Nawaz
  • 353,942
  • 115
  • 666
  • 851
1

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.

Bartosz
  • 3,318
  • 21
  • 31
0

This is not an error in your reverse function, but the standard behaviour of istream::operator>>, which only reads until the first whitespace character.

Christian Rau
  • 45,360
  • 10
  • 108
  • 185
0

You need to use cin.getline(), cin >> s will only read the first word (delimited by space)

John Allen
  • 159
  • 4