将int *转换为string,然后将string转换为int *

时间:2015-10-29 09:56:41

标签: c++ casting

在我的游戏中,我有随机名称的人,名字存储在字符串**

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

期待您的回答!

[编辑]:

感谢您的帮助!我选择了解决方案:

[SOLUTION]:

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()]

3 个答案:

答案 0 :(得分:2)

特别是在学习时,您应该更喜欢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}};
}

此代码未经测试,您可能需要在初始化中添加类型名称。

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

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

虽然我认为,您应该看一下更灵活的C++ random library,而不是旧的C函数rand()

答案 1 :(得分:1)

std :: string既没有operator *,也没有自动转换为char *。您必须使用显式转换为const char *,称为c_str():

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

虽然这仍然是黑客行为,但您的结构解决方案是更合适的方式。更合适的是使用std :: vector而不是数组。

答案 2 :(得分:1)

您可以在字符串向量中存储名称列表,拼写为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;
}