需要使用 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?