2016-10-25 6 views
0

Здравствуйте, я действительно новичок в C++, но ранее программировался в JS и PHP. Я хочу обратить вспять строку, единственными методами, которые я могу использовать, являются length() и at().для сокращения цикла не работает

У меня уже есть решение, но есть что-то, что я хочу изменить, но C++ фактически не делает то, что я хочу на самом деле.

Фактическое решение:

getline(cin, user_input); 
    string inverted_user_input = ""; 

    int user_input_length = user_input.length() - 1; 

    for (int i = user_input_length; i > -1; i--) { 
     inverted_user_input += user_input.at(i); 
    } 

    cout << "The reverse string is: " << inverted_user_input << endl; 

Что я хочу сделать:

getline(cin, user_input); 
    string inverted_user_input = ""; 

    int user_input_length = user_input.length(); 

    for (int i = user_input_length; i > -1; --i) { 
     inverted_user_input += user_input.at(i); 
    } 

    cout << "The reverse string is: " << inverted_user_input << endl; 

Мой первый рабочий раствор хорошо, но я хочу сделать это выглядит симпатичнее.
Я уже знаю, что length() начинает отсчитывать на 1. Вот почему я получаю его по 1 на мой первый код. Но я хочу использовать --i вместо i--, чтобы избежать уродливого - 1, как в первом коде.

Я получаю подсказку, что что-то подает, и я проверил i в первом цикле, но он не уменьшается. Зачем?

+2

_ «единственные методы, которые я могу использовать в длину() и в()» _ Упс! Вы тоже используете '+'. По моему чтению задачи, вполне вероятно, что вы должны менять символы на месте. –

+0

Разница между '--i' и' i - 'на самом деле не имеет значения в приращении цикла' for'. Это имеет значение только где-то вроде 'a [i -]' vs. 'a [- i]'. Инкремент запускается после цикла независимо от того, является ли это '--i' и' i - '. –

+0

- i означает уменьшение i на 1 и возвращение результата. i-- означает возврат i, затем уменьшите его на один ... Я оставляю вас, чтобы понять, почему это имеет значение. – UKMonkey

ответ

4

В вашем примере --i и i-- сделать то же самое. Вам нужно начать подробно - 1. Разница между i-- и --i - это когда вы используете ее в выражении. Например

i = 10; 
x = i--; 

приводит к х = 10, я = 9. Однако, если вы сделали --i вместо этого вы бы х = 9 и I = 9.

+0

Я получаю его '--i' и' i - 'одинаковые для петель –

+0

@Selfproblemmade Нет, это не совсем правильно. Если бы у вас было что-то вроде 'a = b -', это было бы совершенно иначе. Это факт, что у вас есть только одно выражение, так же, как если бы у вас было две разные строки: 'i--; --i; '. –

3

В цикле for пост и пре -decrement не делают то, что вы думаете. Post и pre-декременты относятся к тому, как декремент происходит внутри одного выражения. Например:

a = 1; 
b = a--; // b = 1; 
b = --a; // b = 0; 

Но в цикл:

for (int i = user_input_length; 
    i > -1; 
    --i // This is a single expression 
) { 

Таким образом, в этом случае, --i и i-- делать то же самое. Если вы хотите, чтобы очистить эту петлю, сделайте следующее:

for (int i = user_input.length() - 1; i >= 0; --i) { 
    inverted_user_input += user_input.at(i); 
} 
+0

То же самое, но я получаю: = –

3

Вот два способа реверсирования строки, один с использованием std::reverse алгоритма, а другой с помощью определенной функции простой пользовательский, который должен быть легко адаптироваться к необходимо:

#include <iostream> 
#include <string> 

void reverseString(std::string& s, int length){ 
    char temp; 
    for (int i = 0; i < length/2; i++) 
    { 
     temp = s[length - i - 1]; 
     s[length - i - 1] = s[i]; 
     s[i] = temp; 
    } 
} 

int main(){ 
    std::string s = "Hello"; 
    // Method 1 
    std::reverse(s.begin(), s.end()); 
    std::cout << s; 
    // Method 2 using a fn 
    reverseString(s, s.length()); 
    std::cout << s; 
    return 0; 
} 
0

Есть много хороших ответов здесь, на --i и i--! Но ваш код может не работать для очень длинных строк.

Подпись или без знака?

length of a string является size_t, который является неподписанным. Он может содержать положительные значения, которые больше наибольшего int бланк экспресс. Когда вы конвертируете такую ​​большую длину в int, вы получите переполнение знака: ваше большое положительное число будет неверно истолковано как отрицательное. Ваша петля закончится до первой итерации!

Максимальная длина строки задается string::max_size(). На некоторых реализациях он меньше максимального положительного int. Но это не гарантируется стандартом.

Как решить эту проблему с помощью --i?

Работа с неподписанным требует ухода: сравнение i > -1 будет смешанной операцией, подлежащей переполнению знака. Сделать это i>=0 было бы эквивалентно, но по определению всегда было бы истинным вызывающим и бесконечным циклом. Здесь элегантное исправление, которое требует --i вместо i--:

string inverted_user_input = ""; 
for (auto i = user_input.length(); i >0 ;) { 
    inverted_user_input += user_input.at(--i); 
} 

Online demo (с дополнительно отображение ключевых ограничений)

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