Подстрока вне диапазона при преобразовании строки в нижний регистр

Я пытаюсь получить ввод из командной строки, а затем преобразовать его в нижний регистр. Для этого я написал:

istream& operator>>(istream& is, Card& c)
{
static map<string,Card::Rank> mr = createmr();
static map<string,Card::Suit> ms = createms();

string srank, c1, ssuit;

if (is >> srank >> c1 >> ssuit)
{
if (c1 == "of")
{
string nsrank;
string nssuit;
for(unsigned int i = 0; i < srank.length(); i++) {
char temp = srank[i];
nsrank[i] = tolower(srank[i]);
}

Это терпит неудачу на второй итерации цикла for (точнее, это терпит неудачу на nsrank[i] = tolower(srank[i]);). Отображаемая ошибка — «строковая подстрока вне диапазона», но я не понимаю, как это могло быть, поскольку в строке определенно остались символы.

Чтобы привести пример:
Если я введу «Пиковый туз», он будет повторяться в первый раз (когда i = 0) и передаст штраф «а». Однако затем он возвращается с i, равным 1 (что должно относиться к ‘c’), но вместо этого он говорит мне, что подстрока находится вне диапазона (даже если присвоение char temp работает отлично). Во время отладки «nsrank» претендует на размер 15, поэтому я тоже не вижу, как это может быть вне диапазона ….

0

Решение

Проблема в том, что nsrank — пустая строка, поэтому доступ к Оператор []….

Если pos не больше длины строки, функция никогда
бросает исключения (безбросковая гарантия). В противном случае это вызывает неопределенное
поведение.

Этот работал для меня: http://ideone.com/3LcYqv

#include <iostream>
using namespace std;

int main() {
string srank="Ace of Spades";
string nsrank;

nsrank.resize(srank.length());

for(unsigned int i = 0; i < srank.length(); i++) {
char temp = srank[i];
nsrank[i] = tolower(srank[i]);
}
cout << nsrank << endl;
return 0;
}

Ключ является изменить размер сделать nsrank того же размера, что и srank.

Редактировать: Добавлено компактное решение

Из многих мест, в том числе из этот ответ

#include <algorithm>
#include <string>

string srank="Ace of Spades";
string nsrank=srank;
std::transform(nsrank.begin(), nsrank.end(),nsrank.begin(), ::toupper);
2

Другие решения

измените размер nsrank, чтобы соответствовать размеру srank перед входом в цикл

0

По вопросам рекламы [email protected]