C ++使用字符串元素

时间:2017-06-04 00:45:23

标签: c++ arrays string

我在这里要做的很简单。但在某种程度上,我有些遗憾。我试图用一种严格的字符串元素“预先声明”一个数组,这样我就可以在特定时间内(周期性地)更新数组内容。所以这里是片段:

string ShotBox[] = {}; //"Pre-Declare" array that could contain as many elements here

然后我在Update容器中有一个循环。片断的:

for (int i = 0; i < sizeof(ShotBox) - 1; i++){
            std::string soa = sPath;
            std::string so = soa + ShotBox[i];
            char *cstr = new char[so.length() + 1];
            strcpy(cstr, so.c_str());
            scPath = cstr;
}

除了我尝试“预先声明”的任何方式之外,一切都很好,我得到了内存访问违规。在这个非常精确的片段中,确切的错误是:对于具有未指定边界的数组,空数组无效。

我尝试使用“矢量”但似乎无法解决它。解决这个问题的方法是什么?我不想要图书馆。我需要直接的简短方法或其他方法。

3 个答案:

答案 0 :(得分:1)

使用std::vector<std::string>

vector 管理内部数组。

std::vector<std::string> ShotBox; // (empty)

ShotBox.push_back(a_string); // add a string to the internal array

std::cout << ShotBox[0] << '\n'; // print first element 

答案 1 :(得分:0)

Galik的回答表明std :: vector是Modern C++做你想做的事的方式。

您的代码无法正常工作的原因是以下代码行没有按照您的想法执行

  

string ShotBox [] = {}; //&#34;预先声明&#34;这里可以包含任意数量元素的数组

尝试将以下内容添加到您的程序中......

  

std :: cout&lt;&lt; sizeof(ShotBox)&lt;&lt;的std :: ENDL;

...你应该发现你已经声明了一个零字节长的数组。实际上,如果未指定数组边界,某些编译器会将空初始化程序视为错误。

在C ++语言中,数组是固定长度的实体。近似动态数组的一种方法是使用指针并使用内存管理函数来分配更大的数组,然后将旧数组内容复制到新的更大数组中。

但这是一个非常糟糕的主意。

正确地执行异常安全和效率很难做到,如果你管理它,你将重新实现std :: vector,这似乎是浪费精力!

答案 2 :(得分:0)

  1. 内存访问冲突本身的问题是由于您对sizeof运算符的误解造成的。具体来说,sizeof(ShotBox)是数组的大小(以字节为单位),而不是ShotBox[]数组大小。

    for (int i = 0; i < sizeof(ShotBox)/sizeof(std::string); i++) {
        ...
    }
    
  2. for循环ShotBox[]元素内部根本没有更新。唯一发生的事情是将sPathShotBox[i]连接成一个新的C字符串&#39; cstr&#39;。如果您的目标是更新ShotBox[i]元素,只需将以下分配添加到for循环的末尾:

    for (int i = 0; i < N_SHOT_BOX; i++) {
        ...
        ShotBox[i] = so;
    }
    
  3. 使用std::vector处理可变大小的集合会更方便:

    #include <string>
    #include <vector>
    #include <memory.h>
    
    int main() {
        std::vector<std::string> ShotBox{"str1", "str2", "str3"};
    
        for (int i = 0; i < ShotBox.size(); i++){
            std::string soa = sPath;
            std::string so = soa + ShotBox[i];
            char *cstr = new char[so.length() + 1];
            strcpy(cstr, so.c_str());
            ShotBox[i] = cstr;
        }
    
        return 0;
    }