0

我正在尝试从命令行获取输入,然后将其转换为小写。为此,我写了:

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]);)。显示的错误是“字符串子字符串超出范围”,但我不明白这是怎么回事,因为字符串中肯定还有字符。

举个例子:如果我输入“黑桃A”,那么它将第一次迭代(当i = 0时)并转移'a'罚款。但是,它然后返回 i 等于 1(它应该指代“c”),而是告诉我子字符串超出范围(即使分配给char temp工作正常)。在调试期间,“nsrank”声称大小为 15,所以我看不出它怎么可能超出范围......

4

2 回答 2

2

问题是 nsrank 是一个空字符串,所以使用operator[] ...访问。

如果 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);
于 2014-04-11T07:13:32.007 回答
0

在进入循环之前调整 nsrank 的大小以匹配 srank 的大小

于 2014-04-11T07:24:02.230 回答