首页 > 解决方案 > 需要使用 std::string 用 const char* 填充数组,但它不起作用(我认为它正在存储指针)?

问题描述

我在一个类中定义了一个 const char*,我需要在将其存储在数组中之前填充数字数据

像这样的东西

编辑:更好的最小可重现示例代码

#include <string>

class A
{
public:
    const char* a[3];
    std::string s1;
    void func1();
    void func2();
    void func3();
    //func4(), func5(), func6()............func50();
    void output();
    void print();
};

void A::func1()
{
    s1 = "1";//can be any number determined by the function being called
}

void A::func2()
{
    s1 = "2";
}

void A::func3()
{
    s1 = "3";
}

void A::output()
{
    int i = 0, j = 0;
    for (int i = 0; i < 3; i++)
    {
        switch (i)
        {
        case 0:
            func1();
            break;
        case 1:
            func2();
            break;
        case 2:
            func3();
            break;
        }
    a[i] = s1.c_str();
    }
}

void A::print()
{
    for (int i = 0; i < 3; i++)
    {
        printf("%s ", a[i]);
    }
}

int main()
{
    A example;
    example.output();
    example.print();
}

我希望这里的数组是 = {1, 2, 3},但它是 {3, 3, 3}。有几个这样的功能。


这是上一个,解释起来有点复杂,所以我在上面写了

class A:
{

    public:
    const char* s1;
    void func1();
    void func2();
    void func3();
    //etc.. there are several 50 other functions like this but i've omitted them
    void output();

}

void A::func1()
{

    //do some function work here

    int data = 6//can be anything
    std::string n = std::to_string(n);
    s1 = n.c_str();

    //do something else
}

void A::func2()
{

    //do some function work here

    int data = 6//can be anything
    std::string n = std::to_string(n);
    s1 = n.c_str();

    //do something else
}

//etc...

void output()
{
    const char* a[16];
    int j = 0;
    while(something)
    {
    switch(i):
    {
      case 1:
        func1();
        break;
      case 2:
        func2();
        break;
      case 3:
        func3();
        break;
      //etc..
     }
     const char* a[j % 16] = s1;
     j++;
   }

    //draw a to the screen

}

基本上我需要存储来自以字符串形式调用的各个函数的“当前”16个int数据并实时绘制它(数组预先填充了“NULL”)但问题是数组得到填充相同的值。例如,如果 func1() 为 6 且 func2() 为 5 且 func3() 为 4 且当前 func3() 已被调用,则 const char* a 数组为 = {"4", "4", "4" , "NULL"....} 当它应该是 {"6", "5", "4", "NULL", "NULL"....} 所以当我将它实时绘制到屏幕上时当它应该是 = 6、5、4、NULL、NULL、NUll 时,我只看到 4。我认为问题是数组正在存储指向地址字符串的指针,所以当它改变数组中的所有值时。如果需要更清楚,我可以解释

标签: c++arraysstring

解决方案


欢迎来到悬空指针的世界!据说 C++ 对那些(或至少对 C 不那么敏感)免疫,但前提是您不在中间混合原始指针。

当您编写时,a[i] = s1.c_str();您会a[i]指出 . 拥有的数据s1。指针仅在s1被修改之前有效。在这里你是(不)幸运的,因为所有 3 个值的s1大小都相同,因此实现已经重新使用了相同的内存。所以这 3 个指针仍然指向一个有效地址,它只包含s1.

但形式上,a[0]a[1]悬空指针,因为它们指向一个已达到其生命周期的对象,并且只是a[2]一个有效的指针。


推荐阅读