returning a string from a c++ function

三世轮回 提交于 2019-12-24 14:34:03

问题


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:


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.




回答2:


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

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




回答3:


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.




回答4:


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:


Inplace reverse function was already answered in detail here:

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




回答6:


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:


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.




回答8:


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




回答9:


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



来源:https://stackoverflow.com/questions/8052009/returning-a-string-from-a-c-function

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!