Возврат строки из c ++-функции

Я новичок, и я просматриваю книгу на C ++, и я нахожусь в главе о функциях. Я написал один, чтобы изменить строку, вернуть ее копию в основную и вывести ее.

string reverseInput (ввод строки);

int main() { string input="Test string"; //cin>>input; cout<=0; i--, j++){ reverse[j]=input[i-1]; } return reverse; } 

Вышеизложенное, похоже, работает. Проблема возникает, когда я изменяю следующий код:

 string input="Test string"; 

чтобы:

 string input; cin>>input; 

После этого изменения обратная функция возвращает только обратную сторону первого введенного слова, а не целую строку. Я не могу понять, где я ошибаюсь.

Наконец, есть ли более элегантный способ сделать это, используя ссылки, не делая копию ввода, так что сама переменная ввода изменяется?

Проблема с cin . Он перестает считываться после чтения первого пробела.

См. Раздел «cin and strings» этого руководства: http://www.cplusplus.com/doc/tutorial/basic_io/

Вы можете использовать getline(cin, input); делать то, что вы хотите.

cin>>input; читает слово, а не линию.

Используйте, например, getline(cin, input); читать строку

cin >> input читает слово. Чтобы прочитать всю строку, вы должны использовать getline

 getline(cin, input); 

В этом случае отладчик очень полезен, вы можете просто увидеть значения переменных, проходящих через программу.

Простой cout << вход; помогли бы вам, но если у вас все еще нет хорошей среды IDE с интегрированным отладчиком, я бы предложил вам использовать ее. Eclipse - хороший и с открытым исходным кодом. Visual Studio 2010 Express хорош и свободен, если вы на окнах.

Попробуйте это: istream& getline ( istream& is, string& str );

Он берет целую строку из streamа, который вы даете, например cin и сохраняет его в string переменной. Пример:

 getline(cin, input); 

cin.getline(...) будет работать с буферами символов C-стиля.

Здесь была подробно рассмотрена функция обратного хода на месте:

Как изменить строку на C или C ++?

Проблема с вашим кодом заключается в том, что std::cin читает символ до тех пор, пока не встретит символ, для которого std::isspace(c) возвращает true . Таким образом, пробелы и символы новой строки – все такие символы, которые возвращают true при переходе в std::isspace .

Итак, что вам нужно в основном, 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"; } 

Что касается вашего вопроса о ссылках и копировании:

 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; } 

Вы передаете свой аргумент в качестве ссылки, и вы возвращаете ссылку. Нет копирования, и в теле вы не определяете какую-либо новую строку, вы работаете над одним и тем же экземпляром.

Это не ошибка в вашей обратной функции, а стандартное поведение istream::operator>> , которое читается только до первого символа пробела.

Вам нужно использовать cin.getline (), cin >> s будет читать только первое слово (ограниченное пробелом)