srand() 에 seed 값으로 gettimeofday 에서 usec 과 time(NULL) 하면 나오는 sec 곱해서 넣어줬고요.

왜냐믄, usec 값만으로는 값 범위 자체가 너무 적어서 그랬어유~~

이번 예제에서는 오바플로우는 여부는 신경 안 써도 되구요.

글구 유심히 봐두면 좋은게..


char *p;

uint32_t random;

p = (char *) &random; 요고요.


&random 이렇게 하면 주소값으로 변환되는 건 다들 알죠?

근데 고렇게하면 uint32_t * 이런 형태니까..

그걸 다시 (char *) 이렇게 캐스팅해서

p = (char *) &random;

이렇게 됩니다.

uint32_t random 은 4바이트 저장공간이에요.

그래서 p[0] 부터 p[3] 까지 총 1바이트씩 4개 공간. 이렇게만 접근해야 오류 안 나요.

출력 가능한 아스키문자 범위는 32부터 126까지이고.

이렇게 해서 출력하면 랜덤 문자열 길이가 최대 4가 되니까...

너무 적겠다 싶어서 그걸 limit 만큼 반복시켰습니다.

그래서 문자열 길이 최대값이 8 * 4 = 32 가 됩니다


#include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h> #include <sys/time.h> #include <time.h> char *gen_random_string () { uint32_t random; uint8_t pos = 0; uint8_t limit = 8; char *str; char *p; struct timeval tv; str = malloc (sizeof (uint32_t) * limit + sizeof (char)); gettimeofday (&tv, NULL); srand (tv.tv_usec * time (NULL)); for (uint8_t j = 0; j < limit; j++) { random = rand (); p = (char *) &random; for (uint8_t i = 0; i < 4; i++) { if (p[i] >= 32 && p[i] <= 126) { str[pos] = p[i]; pos++; } } } str[pos] = 0; return str; } int main(int argc, char **argv) { char *str; str = gen_random_string (); puts (str); free (str); return 0; }


참 쉽죠잉?

이렇게 쉬운 언어가 c 언어입니다.