微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

字符集细分错误中的随机单词

如何解决字符集细分错误中的随机单词

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

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

解决方法

通过静态或动态地为字符串分配内存(您在这里确实不需要,但是我仅出于练习目的而提及)。

在我看来,您使事情变得过于复杂。假设您的单词实际上有字母(所以"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;
}

输出:

cik

我在其中静态分配了一个名为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。在How to generate a random int in C?

中了解更多信息

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

,

我做了一些小的修改:

  • 为单词分配存储空间
  • 使用后释放分配的单词
  • 正确使用strcat
  • 确保不会产生长度为零的单词
  • 修复符号初始化程序中的错字
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

const int MAX_WORD = 10;

char *get_random_word(void) {
  const 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 *words = calloc(MAX_WORD + 1,sizeof(char));
  if (!words) {
    return NULL;
  }

  for (int ii = 0; ii < 1 + (rand() % MAX_WORD); ii++) {
    strcat(words,symbols[rand() % 26]);
  }

  return words;
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。