将int*强制转换为字符串,然后将字符串强制转换为int*

Cast int* to string and then string to int*

本文关键字:转换 字符串 int 然后      更新时间:2023-10-16

在我的游戏中,我有一些人的名字是随机的,这些名字存储在字符串**中

string          **name_tabs()
{
  string        **names_tab;
  int           *max_0; *max_0 = 8; //girls number
  int           *max_1; *max_1 = 8; //boys number
  names_tab = new string*[3];
  names_tab[0] = new string[8]; //index 0 for girls_names_tab
  names_tab[1] = new string[8]; //index 1 for boys_names_tab
  names_tab[2] = new string[2];
  //index 2 for max_index when parsing either boys or girls tab
  names_tab[0][0] = "Fernande";
  names_tab[0][1] = "Gertrude";
  names_tab[0][2] = "Aicha";
  names_tab[0][3] = "Pamella";
  names_tab[0][4] = "Carla";
  names_tab[0][5] = "Simone";
  names_tab[0][6] = "Svetlana";
  names_tab[0][7] = "Carmene";
  names_tab[1][0] = "Ludo";
  names_tab[1][1] = "Luc";
  names_tab[1][2] = "Bruno";
  names_tab[1][3] = "Olivier";
  names_tab[1][4] = "Fabrice";
  names_tab[1][5] = "Hadrien";
  names_tab[1][6] = "Hazizoul";
  names_tab[1][7] = "DK";
  names_tab[2][0] = reinterpret_cast<char*>(max_0);
  //this cast is just a try that seemed to work
  names_tab[2][1] = reinterpret_cast<char*>(max_1);
  //idem
  return (names_tab);
}

当我第一次制作这个标签时,它只是一个字符串*[2],但我不想以后在访问我的名字时遇到麻烦,如果我的男孩比女孩多,反之亦然,所以我想做这样的事情:

_name = names_tab[_sex][rand() % *(names_tab[2][_sex])];
// with _name and _sex members of same class Chose

但它不编译。。。

class/laChose.cpp:51:39: erreur: no match for ‘operator*’ (operand type is ‘std::string {aka std::basic_string<char>}’)
     new_name = names_tab[_sex][rand() % *(names_tab[2][_sex])] + new_name;

我尝试了不同的演员阵容,但都不起作用。。。

有可能做我想做的事情吗?或者我必须为我的names_tab创建一个结构吗?

struct names_tab
{
  string         *names_tab[2];
  int            index_max[2];
};

此外,如果可能的话,有没有一种方法可以做到这一点(通过铸造):

names_tab[2][0] = 8;
_name = names_tab[_sex][rand() % names_tab[2][_sex]];

期待您的回答!

[编辑]:

谢谢你的帮助!这是我选择的解决方案:

[解决方案]:

vector<string>          *name_tabs()
{
  vector<string>        *names_tab;
  names_tab = new vector<string>[2];
  names_tab[0].push_back("Fernande");
  names_tab[0].push_back("Gertrude");
  names_tab[0].push_back("Aicha");
  names_tab[0].push_back("Pamella");
  names_tab[0].push_back("Carla");
  names_tab[0].push_back("Simone");
  names_tab[0].push_back("Svetlana");
  names_tab[0].push_back("Carmene");
  names_tab[1].push_back("Ludo");
  names_tab[1].push_back("Luc");
  names_tab[1].push_back("Bruno");
  names_tab[1].push_back("Olivier");
  names_tab[1].push_back("Fabrice");
  names_tab[1].push_back("Hadrien");
  names_tab[1].push_back("Hazizoul");
  names_tab[1].push_back("DK");
  return (names_tab);
}

_name = names_tab[_sex][rand() % names_tab[_sex].size()]

尤其是在学习时,您应该更喜欢std::vectorstd::array<>而不是C阵列:

constexpr std::array<std::vector<std::string>, 2> name_tabs() {
  return {{"Fernande"s, "Gertrude"s, "Aicha"s,
           "Pamella"s,  "Carla"s,    "Simone"s,
           "Svetlana"s, "Carmene"s},
          {"Ludo"s,     "Luc"s,      "Bruno"s,
           "Olivier"s,  "Fabrice"s,  "Hadrien"s,
           "Hazizoul"s, "DK"s}};
}

此代码未经测试,您可能需要将类型名添加到Initializations中。

如果你有更多的男孩或女孩,只需将他们的名字添加到列表中即可。std::vector将负责大小和内存管理。有了它,你应该能够做这样的事情:

_name = names_tab[_sex][rand() % names_tab[_sex].size()];

尽管我认为,您应该看看更灵活的C++随机库,而不是旧的C函数rand()

std::string既没有运算符*,也没有到char*的自动转换。必须使用对const char*的显式转换,称为c_str():

    _name = names_tab[_sex][rand() % *(names_tab[2][_sex].c_str()];

尽管这仍然是黑客行为,但您的结构解决方案是一种更合适的方式。更恰当的做法是使用std::vector而不是数组。

您可以将名称列表存储在字符串向量中,拼写为std::vector<std::string>,然后生成一个0到7之间的随机数,并将其用作向量的索引以显示随机名称。。。

#include <iostream>
#include <ctime>
#include <vector>
#include <string>
using namespace std;
int main()
{
    vector<string> m_vec = {"Fernande", "Gertrude", "Aicha", "Pamella", "Carla", "Simone", "Svetlana", "Carmene"};
    vector<string> f_vec = {"Ludo", "Luc", "Bruno", "Olivier", "Fabrice", "Hadrien", "Hazizoul", "DK"};
    srand(time(0)); // ensure truly randomized number   
    int x = rand() % 8; // find random number between 0 and 7
    cout << "Random boy's name: " << m_vec[x] << endl;
    x = rand() % 8;
    cout << "Random girl's name: " << f_vec[x] << endl;
    return 0;
}