【问题标题】:How to create random name generator from input files c++如何从输入文件c ++创建随机名称生成器
【发布时间】:2020-06-05 20:05:55
【问题描述】:

我有两个文本文件,firstnames.txtlastnames.txt。每个都有 20 个名字,而且都换了一行。我需要在我的程序中创建一个随机名称生成器。

我不允许使用string[],所以我必须使用char*[]。到目前为止,我的计划是将所有名称添加到char*[] 数组中,然后在 1 到 20 之间生成一个随机数并获取该索引以获得随机名称。我不知道如何将文本文件中的名称转换为char*[]

这是我目前所拥有的:

int a = 0;
//Open first name file
ifstream fnameFile;
fnameFile.open("firstnames.txt");
char* fname[20];
//Put names from file into char*[] array
while (fnameFile.good()) {
    getline(fnameFile, fname[a]);
    a++;
}

getline() 不适用于 char*[] 数组,那么如何将这些名称放入数组中?

【问题讨论】:

  • istream::getline()char * 一起使用。
  • 你有一个 char 指针数组。您必须为它们分配内存,或者使用 char 数组。
  • 第一个问题是您愿意使用的名称长度是否有上限。还是您希望您的代码能够读取任意长度的名称?
  • 请问为什么字符串[]被禁止?
  • 有一个限制,15。我不能用string[],因为我的老师不让我

标签: c++ arrays char


【解决方案1】:

std::getline() 仅适用于 std::basic_string 类型,例如 std::string

std::istream::getline()char* 一起使用。您只是没有为 char* 分配任何内存来指向。

您可以使用char[][] 代替char*[]char[] 衰减 变成char*),例如:

const int max_name = ...; // some limit you decide
//Open first name file
ifstream fnameFile("firstnames.txt");
char fname[20][max_name];
//Put names from file into char[][] array
int a = 0;
while ((a < 20) && fnameFile.getline(fname[a], max_name)) {
    ++a;
}

如果你绝对需要使用char*[],那么你需要为每个char*分配内存,例如:

const int max_name = ...;
//Open first name file
ifstream fnameFile("firstnames.txt");
char* fname[20];
//Put names from file into char*[] array
int a = 0;
while (a < 20) {
    fname[a] = new char[max_name];
    if (!fnameFile.getline(fname[a], max_name)) {
        delete[] fname[a];
        break;
    }
    ++a;
}
...
for (int i = 0; i < a; ++i) {
    delete[] fname[a];
}

【讨论】:

  • 后续问题:我正在创建一个随机 int 以从列表中随机选择一个名称。我将如何访问列表中的名字?当我做 fname[0][0] 时,我只得到名字的第一个字母。我有一个带有 char fname 的 Node 结构,所以我想将列表中的一个名字分配给一个节点(Node->fname = fname[?][?])。那我该怎么做呢?
  • @madaniloff 在Node 结构中使用char *fname;,然后为fname 数组的第一维生成索引:Node-&gt;fname = fname[index]; 这将适用于我向您展示的两个数组示例(char[][]char*[])。
猜你喜欢
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 2014-12-18
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
相关资源
最近更新 更多