gpt4 book ai didi

c - 如何使用 C 中的 memset 将随机数量的随机小写字符设置为 Struct 成员

转载 作者:行者123 更新时间:2023-11-30 14:44:42 25 4
gpt4 key购买 nike

我被迫使用 memset 和 drand48() 来设置小写字母(“a”到“z”)随机字符的随机数(2 - 7)。我的代码返回非 ASCII 字符,我不知道为什么。

struct Record {
int seqnum;
float threat;
unsigned int addrs[2];
unsigned short int ports[2];
char dns_name[NUMLTRS];
};

我的代码位于 for 循环中:

memset(rec_ptr[i].dns_name, (char)((122 * drand48()) + 97), 
((sizeof(char) * 7) * drand48()) + (sizeof(char) * 2));

最佳答案

My code returns non ASCII characters and I am not sure why.

用于生成小写字母的比例错误。

(122 * drand48()) + 97 转换为整数类型可以轻松生成 122 个不同的值。 [97...218]。这超出了 [0...127] 的 ASCII 范围。

<小时/>

How do I set a random number of random lowercase character ...

drand48() 提供一个随机值 [0...1.0)。按 26 缩放并截断以获得 26 个不同的索引。

int index = (int) (drand48()*26);  // 0...25

迂腐的代码会关心可能将乘积四舍五入为 26.0 的少数随机值

if (index >= 26) index = 26 - 1;
int az = index + 'a';
// or look up in a table if non-ASCII encoding might be used
// 12345678901234567890123456
int az = "abcdefghijklmnopqrstuvwxyz"[index];

选择随机长度将使用相同的东西,但使用 NUMLTRS 而不是 26。

int length = (int) (drand48()*NUMLTRS); 
if (index >= NUMLTRS) index = NUMLTRS -1;
<小时/>

... to a Struct member using memset in C

目前尚不清楚 dns_name[] 是否应该全部相同,或者通常是不同的字母。

struct Record foo;
if (all_same) [
memset(foo.dns_name, az, length);
} else {
for (int i = 0; i < length; i++) {
int index = (int) (drand48()*26); // 0...25
if (index >= 26) index = 26 -1;
int az = index + 'a';
foo.dns_name[i] = az; // Does not make sense to use memset() here
}
}
<小时/>

最后,如果 dns_name[] 是一个字符串以方便以后使用,请使用 +1 大小进行声明

dns_name[NUMLTRS + 1];

// above code

foo.dns_name[NUMLTRS] = '\0'; // append null character
printf("dna_name <%s>\n", foo.dns_name);

关于c - 如何使用 C 中的 memset 将随机数量的随机小写字符设置为 Struct 成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53419153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com