Мой код возвращает не символы 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;
... для члена Struct с использованием memset в 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);