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

Posted

技术标签:

【中文标题】需要使用 std::string 用 const char* 填充数组,但它不起作用(我认为它正在存储指针)?【英文标题】:Need to fill an array with const char* using std::string but it's not working(i think it's storing the pointers instead)? 【发布时间】:2020-12-15 07:43:24 【问题描述】:

我在一个类中定义了一个 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".... 所以当我将它实时绘制到屏幕上时,我只看到 4,它应该是 = 6、5、4、NULL、NULL、NUll.... 我认为问题在于数组正在存储指向地址的指针字符串,所以当它改变数组中的所有值时。如果需要更清楚,我可以解释

【问题讨论】:

我重写了上面的代码以更好地解释我的意思 同样的建议也适用,为什么不将a 设为三个字符串的数组呢?指针很难而且有问题,字符串很容易。 @john:指针不是错误的! std::string 的实现包含一堆指针。但它们需要非常谨慎的编程,并且只能用于现代 C++ 中的低级实现。 @SergeBallesta 为什么 a[i] 是一个字符?不应该是 const char* 吗? @JerSci!糟糕,我没有正确阅读您的代码。但更糟糕的是,因为它们是 悬空 指针 【参考方案1】:

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

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

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

【讨论】:

以上是关于需要使用 std::string 用 const char* 填充数组,但它不起作用(我认为它正在存储指针)?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我可以在 std::map<std::string, int> 中使用 const char* 作为键

如何干净地使用:const char* 和 std::string?

无法从 'const std::string [3]' 转换为 'std::string'

将 std::string_view 传递给执行 const std::string& 的 API

如何使用 UTF-8 字符序列在 C++ 中初始化 const char* 和/或 const std::string?

c++,为啥要使用 const std::string & parameterName? [复制]