如何解决字符集细分错误中的随机单词
我想从给定集合的随机字符中得到一个单词,但是出现错误,即分段错误。如何摆脱它?
#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 举报,一经查实,本站将立刻删除。