returning a string from a c++ function

2019-08-05 13:45发布

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?

9条回答
小情绪 Triste *
2楼-- · 2019-08-05 13:57

Inplace reverse function was already answered in detail here:

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

查看更多
叛逆
3楼-- · 2019-08-05 14:05

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.

查看更多
别忘想泡老子
4楼-- · 2019-08-05 14:07

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.

查看更多
等我变得足够好
5楼-- · 2019-08-05 14:16

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.

查看更多
We Are One
6楼-- · 2019-08-05 14:16

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";
}
查看更多
放我归山
7楼-- · 2019-08-05 14:17

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

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

查看更多
登录 后发表回答