Обратная итерация по символам строки в C ++ - PullRequest
2 голосов
/ 24 февраля 2020

Я хочу напечатать обратную строку

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string str = "no", str1 = "yes";
    for (int i = str.size() - 1; i >= 0; i--)
        cout << str[i];
    for (int j = str1.size(); j >= 0; j--) //without minus one
        cout << str1[j];
}

В чем разница между двумя циклами? Когда он дает нулевой указатель?

Ответы [ 2 ]

2 голосов
/ 24 февраля 2020

См. здесь :

enter image description here

Так что в C ++ 11 это должно быть хорошо, так как печатает нулевой символ, но в более ранних версиях это также могло быть неопределенным поведением. Это означает, что может произойти что угодно, в том числе любая ошибка или даже ожидаемое поведение.

Если это работает в вашей системе, но не в той системе, на которой вы проводите экзамен, возможно, это потому, что экзаменационная система использует старую версию с неопределенным поведением. Или это неопределенное поведение в обеих системах, но оно проявляется по-разному.

1 голос
/ 24 февраля 2020

@ Blaze уже ответил, почему доступ к str[str.size()] может вызвать проблемы.

Один из способов избежать этих проблем при итерации, подобной массиву, заключается в использовании iterator - в вашем случае reverse_iterator поможет. :

std::string::reverse_iterator itr = str1.rbegin();

while (itr != str1.rend())
   std::cout << *itr++;
...