Как установить случайное количество случайных строчных букв для члена Struct, используя memset в C - PullRequest
0 голосов
/ 21 ноября 2018

Я вынужден использовать 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));

1 Ответ

0 голосов
/ 22 ноября 2018

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