存储const char *会给我随机字符

时间:2015-12-06 02:48:32

标签: c++ string struct char

好的,基本上我有这样的结构

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;
}

我想我记得得到这些花状的形状,我想我甚至看到了汉字,但是即使我没有改变程序中的任何东西它们也不一致,如果我跑了好几次,我会看到几种不同的组合符号,有时候不会出现符号。

2 个答案:

答案 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