2014-02-06 2 views
-6

Я должен распечатать строковый ввод назад. Например:Как напечатать строку назад в C++?

Введите строку для обратного: строки
gnirts

Это то, что я до сих пор:

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    string input; 

    cout<<"Enter the string to reverse: " << endl; 
    cin>>input; 

    int size = input.length(); 

    for(int i=size; i>0; i--) 
    { 
     cout<<input[i]; 
    } 

    return 0; 
} 
+1

И проблема? – 0x499602D2

ответ

3

Ваших начальных точек индекса массива \0, что вам нужно что-то типа -

for(int i=size-1; i>=0; i--) // <-- like this 

или

for(int i=size; i>0; i--) 
{ 
    cout<<input[i-1]; // <-- like this 
} 

или вы могли бы использовать reverse

#include <algorithm> // <-- add this include 
std::reverse(input.begin(), input.end()); // <-- reverse the input string. 
+1

Это не за гранью, но он начинается с \ 0 терминатора строки (ничего не печатаемого). – PSkocik

+1

http://www.cplusplus.com/reference/string/string/operator%5B%5D/ «Если pos равно длине строки, функция возвращает ссылку на нулевой символ ('\ 0'). " – PSkocik

+1

@ ThorX89 Согласно http://en.cppreference.com/w/cpp/string/basic_string/operator_at, только если используется перегрузка const. (Который я думаю, что это должно, но может быть важно отметить.) – Xarn

2

Самый простой способ заключается в использовании стандартного алгоритма зЬй :: reverse_copy

std::reverse_copy(input.begin(), input.end(), std::ostream_iterator<char>(std::cout)): 
std::cout << std::endl; 

Это самый простой способ, потому что вы не будете делать ошибка в контрольной заявке цикла.)

EDIT : Я забыл указать, что вы также можете использовать алгоритм std :: copy.

std::copy(input.rbegin(), input.rend(), std::ostream_iterator<char>(std::cout)); 
std::cout << std::endl; 

Также вы можете использовать временный объект. Например

std::cout << std::string(input.rbegin(), input.rend()) << std::endl; 

если использовать цикл, то правильный цикл будет выглядеть

for (std::string::size_type i = input.size(); i != 0;) 
{ 
    std::cout << input[--i]; 
} 
std::cout << std::endl; 

или

for (std::string::size_type i = input.size(); i != 0; --i) 
{ 
    std::cout << input[i - 1]; 
} 
std::cout << std::endl; 
+1

Лично я бы пошел на 'std :: copy (input.rbegin() ...', но +1 для использования 'ostream_iterator'. – Xarn

+0

@ Xarn Я еще не читал этот комментарий, когда вспомнил о std :: copy . :) –

Смежные вопросы