我正在尝试从命令行获取输入,然后将其转换为小写。为此,我写了:
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时)并转移'a'罚款。然而,然后它返回i等于1(应该引用'c'),但它告诉我子串超出范围(即使char temp
的赋值工作正常)。在调试过程中,“nsrank”声称大小为15,所以我不知道它是如何超出范围的......
答案 0 :(得分: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;
}
关键是resize使nsrank与srank的大小相同。
来自许多地方,其中包括this answer
#include <algorithm>
#include <string>
string srank="Ace of Spades";
string nsrank=srank;
std::transform(nsrank.begin(), nsrank.end(),nsrank.begin(), ::toupper);
答案 1 :(得分:0)
在进入循环之前调整nsrank以匹配srank的大小