首页 > 解决方案 > 来自字符集分段错误的随机词

问题描述

我想从给定集合中的随机字符数中获取一个单词,但出现错误分段错误。如何摆脱它?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

char* getrand() {
  char* symbols[] = {"a,", "b", "с", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"};
  char* letter;
  char* words;
  for (int i = 0; i < rand() % 10; i++) {
   letter = symbols[rand() % 26];
   words = strcat(letter, symbols[rand() % 26]);
  }
  return words;
}

int main(void) {
  srand(time(NULL));
  char* new_word;
  new_word = getrand();
  printf("%s\n", new_word);
  return 0;
}

标签: arrayscstringpointersmemory-management

解决方案


通过为您的字符串分配内存,无论是静态的还是动态的(在这里您确实不需要,但仅出于练习目的,我会提到它)。

在我看来,你把事情复杂化了。假设你的话实际上有字母("a,"错字也是如此,你真的想写"a"),那么你可以这样做:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX_LEN 10
#define SYMBOLS_LEN 26

void getrand_word(char* word, int word_max_len) {
  char symbols[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
  char letter;
  for (int i = 0; i < rand() % word_max_len; i++) {
   letter = symbols[rand() % SYMBOLS_LEN];
   word[i] = letter;
  }
}

int main(void) {
  srand(time(NULL));
  char word[MAX_LEN] = {0};
  getrand_word(word, MAX_LEN);
  printf("%s\n", word);
  return 0;
}

输出:

西克

我在其中静态分配了一个名为 的字符串数组word,其大小MAX_LEN等于 10,因为我们知道我们最多会随机选择一个字母(符号)9 (10 - 1) 次。

所以我们的单词最多可以有 9 个字母,但是我们的字符串数组中还需要一个槽位,以便将 NULL 终止符存储到其中,因此我们需要我们的字符串数组大小为 10。

然后我将此字符串数组传递给getrand_word(),以便随机填充我的字符串。

在那个方法中,我有一个字符数组(而不是像你的例子中的字符串),因为符号(字母)是一个字符,而不是一个字符串。

for 循环最多会运行(word_max_len- 1 次),因为rand() % word_max_len在 [0, ] 中生成整数word_max_len。在那里我们随机选择一个数字来索引我们的symbols数组。我们希望能够从头到尾选择任何字母,所以我们需要rand() % SYMBOLS_LEN. 阅读如何在 C 中生成随机整数?

选择字母后,只需将其附加到字符串中即可,方法是使用循环计数器作为字符串的索引。


推荐阅读