C++ 将字符串转换为小写时,子字符串超出范围

C++ 将字符串转换为小写时,子字符串超出范围,c++,tolower,C++,Tolower,我试图从命令行获取输入,然后将其转换为小写。为此,我写了: 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 &g

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

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]);
            }
istream&operator>>(istream&is、卡和c)
{
静态映射mr=createmr();
静态映射ms=createms();
字符串srank、c1、ssuit;
如果(is>>srank>>c1>>ssuit)
{
如果(c1=“of”)
{
字符串nsrank;
线装;
for(无符号整数i=0;i
它在for循环的第二次迭代中失败(更准确地说,它在
nsrank[i]=tolower(srank[i]);
上失败)。显示的错误是“字符串子字符串超出范围”,但我不明白为什么会出现这种情况,因为字符串中肯定还有字符

举个例子:
如果我输入“黑桃Ace”,它将第一次迭代(当I=0时)并传输“a”罚款。但是,它随后返回,I等于1(应指“c”),但它会告诉我子字符串超出范围(即使对
char temp
的赋值工作正常)。在调试期间,“nsrank”声明大小为15,因此我也看不出它怎么会超出范围….

问题是nsrank是一个空字符串,因此使用….进行访问

如果pos不大于字符串长度,则该函数永远不会 抛出异常(无抛出保证)。否则,将导致未定义 行为

这一个对我有用:

#包括
使用名称空间std;
int main(){
string srank=“黑桃王牌”;
字符串nsrank;
nsrank.resize(srank.length());
for(无符号整数i=0;i无法在进入循环之前调整nsrank的大小以匹配srank的大小

我想说问题出在
nsrank[I]
字符串nsrank
中。除了@jsantander注释之外,您在所有交互中都确实存在问题(尽管运行时只在第二次交互中检测到它):
nsrank[I]
是对所有
i
的越界访问,因为
nsrank
未初始化,因此其大小为0.+1,但您需要

#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;
}
#include <algorithm>
#include <string>

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