arrays - 来自字符集分段错误的随机词
问题描述
我想从给定集合中的随机字符数中获取一个单词,但出现错误分段错误。如何摆脱它?
#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;
}
输出:
西克
我在其中静态分配了一个名为 的字符串数组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 中生成随机整数?
选择字母后,只需将其附加到字符串中即可,方法是使用循环计数器作为字符串的索引。