Я пытаюсь получить ввод из командной строки, а затем преобразовать его в нижний регистр. Для этого я написал:
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, поэтому я тоже не вижу, как это может быть вне диапазона ….
Проблема в том, что 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);
измените размер nsrank, чтобы соответствовать размеру srank перед входом в цикл