将字符串转换为小写时,子字符串超出范围
Substring out of range when converting string to lowercase
我正试图从命令行获取输入,然后将其转换为小写。为了做到这一点,我写了:
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,所以我看不出这怎么可能超出范围。。。。
问题是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的大小
相关文章:
- C++ - 使用基于范围的 for 循环将字符值分配给向量中的字符串不会分配值
- 字符串的矢量并使用 C++20 范围进行转换
- C++ - 成功打印超出范围的字符串索引
- C++十进制到十六进制(字符串下标超出范围)
- 如何修复范围内的字符串声明错误
- C++ 字符串订阅超出范围的问题
- 在遍历字符串时,为什么我没有超出范围错误,即使我已经超出了它的长度?
- 初始检查以查看子字符串是否在范围内
- 在此范围C 中未声明字符串和char变量
- 尝试对字符串[数组]>>cin 并出现错误(" "字符串下标超出范围")
- 如何在 C++ 的字符串中打印从一个索引到另一个索引的字符范围
- C++:,当我使用字符串数组时,它的字符串下标超出了范围
- 如何将标准::字符串拆分为标准::string_views的范围 (v3)
- 为带有带前缀的字符串的容器查找相等的范围
- 为什么程序显示字符串超出范围
- 函数中的字符串范围
- c++将大型数字字符串映射到数字字符串范围
- C++指向一个字符串范围的指针(加载一个大文件)
- 在字符串范围列表中搜索字符串
- 在给定字符串向量(按长度排序)的情况下,用于查找等长度字符串范围的惯用C++