возвращение строки из функции c ++ - PullRequest
1 голос
/ 08 ноября 2011

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

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

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

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

string input="Test string";

до:

string input;
cin>>input;

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

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

Ответы [ 9 ]

7 голосов
/ 08 ноября 2011

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

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

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

4 голосов
/ 08 ноября 2011

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

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

4 голосов
/ 08 ноября 2011

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

getline(cin, input);

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

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

2 голосов
/ 08 ноября 2011

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

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

getline(cin, input);

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

1 голос
/ 08 ноября 2011

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

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

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

1 голос
/ 08 ноября 2011

Проблема с вашим кодом в том, что 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";
}
1 голос
/ 08 ноября 2011

Функция обратного хода уже подробно описана здесь:

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

0 голосов
/ 08 ноября 2011

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

0 голосов
/ 08 ноября 2011

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

...