字符串由于长度不正确而无法循环打印

时间:2018-11-05 20:57:32

标签: c++

我的字符串长度有问题。我根本不明白为什么我的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;
}

2 个答案:

答案 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