2016-01-05 3 views
-1

Я учусь std::string, и я хочу:Простая программа с станд :: строка не работает

  1. Входная строка
  2. Каждая вторая буква сделать Верхний регистр
  3. Выход новой строки

    #include "stdafx.h" 
    #include <iostream> 
    #include <string> 
    using namespace std; 
    int main() 
    { 
        string myStr; 
        getline(cin,myStr); 
        if (myStr.begin() != myStr.end()) 
        { 
         for (auto it = myStr.begin(); it != myStr.end() ; it += 2) 
          *it = toupper(*it); 
        } 
        cout << myStr; 
        system("pause"); 
        return 0; 
    } 
    

    Но после ввода я получаю ошибку here:

+1

Начните с нажатия «Повторить», чтобы запустить отладчик и посмотреть, где в вашем коде произошел сбой. –

+0

Не проблема, но тест 'if (myStr.begin()! = MyStr.end())' ничего не выполняет, так как условие цикла в любом случае устранит этот случай. –

+0

@PeteBecker Это преждевременная оптимизация, если строка пуста. И поскольку все преждевременные оптимизации практически бесполезны и не нужны. –

ответ

2

it += 2 ведет вас за пределы, если условие завершения цикла it != myStr.end(). Таким образом, разыменовывание

*it = toupper(*it); 

- неопределенное поведение.

it += 2 никогда не даст вам точного значения итератора myStr.end(), как у вас есть для условия завершения цикла.


Что касается Вашего комментария:

Так как я могу это исправить?

Просто держите его простым и понятным, например, например. используя что-то вроде

for (size_t i = 0; i < myStr.length() ; ++i) { 
    if(i % 2) { // Every second letter ... 
     myStr[i] = toupper(myStr[i]); 
    } 
} 
+0

Так как я могу это исправить? Каждое второе письмо делает Uppercase –

+0

Это будет - для строк с четным размером. – SergeyA

+0

@SergeyA У вас есть идея, как заставить мою программу работать с строками с одним размером? –

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