如何在C中使用memset为结构成员设置随机数目的随机小写字符

如何在C中使用memset为结构成员设置随机数目的随机小写字符,c,random,memset,C,Random,Memset,我被迫使用memset和drand48()来设置随机数(2-7),这些随机字符是小写字母('a'到'z')。我的代码返回非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].

我被迫使用memset和drand48()来设置随机数(2-7),这些随机字符是小写字母('a'到'z')。我的代码返回非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));
我的代码返回非ASCII字符,我不知道为什么

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

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


如何设置随机小写字符的随机数

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;

…使用C中的memset将

目前尚不清楚
dns\u 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
  }
}

ASCII的范围仅为
0
-
127
。除非
drand48()
return
s
0
(char)((122*drand48())+97)
中,否则它不适合。为什么您必须使用
memset
?正在执行
dns\u name[i]=…
如果你必须敲出多个字符,看起来更符合逻辑。
字符的大小是每个定义的
1
。总是。而且
1
对于乘法是中性的,所以放弃它。
lrand48()
会更合适,因为你想要整数。..o o(每次使用时,小猫都会死:(:)
memset
的问题是,将多个字节设置为同一个值是一种非常好的方法,但将多个字节设置为不同的值是一种非常糟糕的方法。在这种情况下,我认为对每个字母使用一个数组赋值要简单得多。
(int)(0.9999…
真的可以四舍五入到
1
?“当实浮点类型的有限值转换为除_Bool以外的整数类型时,小数部分被丢弃(即,该值被截断为零)”(@usr2564301问题与
(int)(0.9999…)无关)
,但在任何舍入模式和任何
FLT\u EVAL\u模式下,
0.9999…*26
可能会导致26.0?正确,数学上
0.9999…*26
总是小于26,但这是FP数学。深入分析可能表明26.0是不可能的,但如果不这样做,检查是谨慎的。
dns_name[NUMLTRS + 1];

// above code

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