我的字符串长度有问题。我根本不明白为什么我的str3的长度为0。为什么它的长度为0?我将其初始化为0,但随后在for循环中,我给str3的每个索引赋予_值。我假设每个下划线都为str3提供了另一个索引,这意味着长度将增加一个,对吗?这是怎么回事?
程序正在做的是在两个字符串比较(str1和str2)中找到某些索引值,并给str3对应于0的索引值(来自tempvar的输出)
for (int z = 0; z < str1.length(); z++){
//str3 initilization
str3[z] = '_';
std::cout << str3[z];
if(z == str1.length() - 1){
std::cout << std::endl;
}
}
这是我的完整程序:
#include <iostream>
#include <string.h>
int main(){
std::string str1;
std::string str2 = "RLSTNE";
std::string str3;
std::string* arr_temp = new std::string[10];
std::string* arr_temp1 = new std::string[10];
bool restart = true;
do{
std::cout << "What string?" << std::endl;
getline(std::cin, str1);
*arr_temp1 = str1;
*arr_temp = str2;
for (int z = 0; z < str1.length(); z++){
//str3 initilization
str3[z] = '_';
std::cout << str3[z];
if(z == str1.length() - 1){
std::cout << std::endl;
}
}
for(int y = 0; y < str2.length(); y++)
{//index replacement
for(int x = 0;x <= str1.length(); x++)
{
int tempvar = arr_temp->compare(y,1, *arr_temp1, x, 1);
if((tempvar == 0))
{
str3[x] = str1[x];
}
}
}
std::cout << "Restart? 1 = yes, 0 = no" << std::endl;
std::cin >> restart;
}while(restart);
std::cout << "str3: ";
for(int xy = 0; xy < str3.length(); xy++)
{//str3 print
std::cout << str3[xy];
}
if(restart == false)
{
delete arr_temp;
delete arr_temp1;
arr_temp = NULL;
arr_temp1 = NULL;
std::cout << *arr_temp1 <<std::endl;
}
return 0;
}
答案 0 :(得分:4)
str3是一个空字符串,当您运行时:
str3[z] = '_';
std::cout << str3[z];
您正在访问无效的索引,因为该字符串为空。
因此,您首先应该在循环之前设置str3的大小:
str3.resize(str1.length());
如果您不清楚std :: string的行为,可以尝试使用at成员函数来访问单个字符,而不是使用[]运算符,就像索引无效一样,它将引发异常:
std::string any;
any.at(5) = 'a'; //will throw std::out_of_range
答案 1 :(得分:0)
您的str3
为空,因为在创建时未指定长度,即长度为0。使用[]
索引超出尺寸的元素的访问/修改操作是未定义的(对于{ {3}}。
在访问和修改元素之前,您应该使用填充构造函数(reference)初始化str3
,或在其上使用resize
。