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?

1
  • 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. Commented Nov 8, 2011 at 14:57

9 Answers 9

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.

Sign up to request clarification or add additional context in comments.

Comments

4

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

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

Comments

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.

1 Comment

Thanks for the input. I will start using a debugger.
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.

Comments

1

Inplace reverse function was already answered in detail here:

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

3 Comments

This won't help in his case, as he still reads the string incorrectly.
Agree, but getting only first word was already answered several times :-)
Ah sorry, I overread that he explicitly asked for an in-place version.
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";
}

Comments

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.

Comments

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.

Comments

0

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.