好的,基本上我有这样的结构
struct person{
const char* name;
const char* about_me;
const char* mom_name;
const char* age;
};
然后为了使我的代码多才多艺,我有
struct Person PersonAsArray[MAX_ARRAY - 1];
然后我有一个文件,读入一堆东西,最终我解析它。但是当我解析它时,我得到一个std::string
所以我必须把它转换成const char*
所以继承我的代码:
getline(file, line);
//break the line up into 2 parts (because in the file its "name=John")
//these two parts are called id and value
if(id == "name"){
const char* CCvalue = value.c_str();
cout << CCvalue << endl; // its fine here
PersonAsArray[i].name = CCvalue; //i is incremented each time i need a new struct
}
if(id == "age"){
PersonAsArray[i].age = atoi(value.c_str());
}
//and some more of this stuff... eventually i have
cout << PersonAsArray[0].name << endl;
cout << PersonAsArray[0].about_me << endl;
cout << PersonAsArray[0].mom_name << endl;
cout << PersonAsArray[0].age << endl;
但是当我最终cout所有内容时,我最终得到的东西看起来像this。我对有什么事情以及它为什么给我符号感到有点好奇?它并不总是相同的符号。有时我会得到笑脸,有时甚至不会得到整排的矩形。我不知道我在做什么,它可能是我的编码中的一些主要缺陷。但是当我做这样的事情时也会发生这种情况
string hi = "hello"
for(i = 0; hi[i] != '\0'; i++){
char x = hi[i];
string done = "";
if(x == 'h') done += "abc";
if(x == 'e') done += "zxc";
if(x == 'l') done += "aer";
if(x == 'o') done += "hjg";
cout << done;
}
我想我记得得到这些花状的形状,我想我甚至看到了汉字,但是即使我没有改变程序中的任何东西它们也不一致,如果我跑了好几次,我会看到几种不同的组合符号,有时候不会出现符号。
答案 0 :(得分:1)
您没有阅读the documentation!
from Tkinter import *
fenetre = Tk()
fenetre.title("Life Quiz")
from random import shuffle
#questions
quest_1 = "What is your favorite color?"
quest_2 = "Which of these animals do you like the most?"
quest_3 = "Which of these superpowers would you want to have the most?"
quest_4 = "Which food would you want to eat right now?"
quest_5 = "If you could only bring one thing on an island, what would it be?"
#liste de réponse
list_reponse = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
#Associé liste_reponse avec IntVar()
list_reponse[0] = IntVar()
list_reponse[1] = IntVar()
list_reponse[2] = IntVar()
list_reponse[3] = IntVar()
list_reponse[4] = IntVar()
class Questions(object):
#fonction pour afficher les questions et les choix de réponses
def __init__(self, master, n_question):
self.master = master
self.liste_choix =[ [quest_1, "Blue", "White", "Yellow", "RAINBOWS", "Red"], [ quest_2, "Blue Whale", "Pig", "Cat", "Unicorns", "Dog"], [quest_3, "Make it rain whenever you want", "Transform yourself into a ladder", "Invisibility when no one's around", "Read the mind of unicorns", "Ability to fly" ], [quest_4, "Ice cream", "Sushi", "Salad", "Cupcakes", "Pizza"] ,[quest_5, "Nothing...", "A fishing rod", "A book", "A leprechaun", "A knife"] ]
self.liste_choix_questions = self.liste_choix [n_question]
shuffle(self.liste_choix_questions)
self.display_frame = None
self.next_question = 0
def display_next(self):
if self.next_question < len(self.liste_choix_questions):
if self.display_frame:
self.display_frame.destroy()
self.display_frame=Frame(self.master)
self.display_frame.grid(row=0, column=0)
Label(self.display_frame,
text=self.liste_choix_questions[0],
bg="lightblue").grid(row=0, column=0)
display_next(self)
R1 = Radiobutton(fenetre, text= self.liste_choix[n_question][1], variable= list_reponse[n_question], value=1)
R1.pack( anchor = W )
R2 = Radiobutton(fenetre, text= self.liste_choix[n_question][2], variable= list_reponse[n_question], value=2)
R2.pack( anchor = W )
R3 = Radiobutton(fenetre, text= self.liste_choix[n_question][3], variable= list_reponse[n_question], value=3)
R3.pack( anchor = W)
R4 = Radiobutton(fenetre, text= self.liste_choix[n_question][4], variable= list_reponse[n_question], value=4)
R4.pack( anchor = W )
R5 = Radiobutton(fenetre, text= self.liste_choix[n_question][5], variable= list_reponse[n_question], value=5)
R5.pack( anchor = W )
Button(self.display_frame, text="next",
command=display_next).grid(row=1, column=0)
n_question += 1
Q = Questions(fenetre,1)
fenetre.mainloop()
返回的值不会永远存在。
从
std::string::c_str()
获得的指针可能会失效:
- 将对字符串的非const引用传递给任何标准库函数,或
- 在字符串上调用非const成员函数,不包括
c_str()
,operator[]
,at()
,front()
,back()
,begin()
,rbegin()
和end()
。
析构函数就是这样一个“非const成员函数”。
指针无效后,就无法使用。当你尝试时,你要么将数据存储在内存中的某个任意位置(你的计算机徒劳地尝试理解这些数据,好像它是文本,导致你描述的鲜花和汉字)或其他不可预测的,奇异的症状。
很遗憾,您没有提供complete, minimal testcase因此我们不知道rend()
真正如何适合您的代码,但很明显它在您的代码之间无法完好无损这里很好“和你有问题的代码。
不要长期存储value
的结果。没有必要,而且很少有用。
tl; dr让std::string::c_str()
存储person
,而不是悬挂指针。
答案 1 :(得分:1)
问题是你有像
这样的东西{
std::string value;
// fill value
PersonsAsArray[i].name = value.c_str();
}
现在,value
是一个局部变量,在退出声明范围时会被销毁。您将指向其内部数据的指针存储到.name
,但您没有复制它,因此在销毁后它指向垃圾。
您应该有一个std::string name
字段,而不是const char*
,它将自行处理复制和保留内容及其复制赋值运算符或手动为const char*
分配内存,例如通过strdup
。