字符串随机器运行异常:__rand_char函数中字符指针l无法正常工作求助
问题:随机字符生成函数异常排查
我写了一段代码,本意是生成随机字符串直到匹配"Hello World",但运行时__rand_char()函数完全不正常工作。用-Wall编译没报错,而且我试了打印字符指针l或者获取它的长度都不行,怀疑这个指针有问题。代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> char __rand_char(){ srand(time(0)); char *l="abcdefghijklmnopqrstuvwxyz"; return l[rand() % 26]; } void randomize(char *str){ register int counter=0; while(*(str+counter++)!='\0'){ *(str+counter)=__rand_char(); } } int main(void){ char str[12]; memset(str,0,sizeof(char)*12/sizeof(char)); str[11]='\0'; char cmpstr[]="Hello World"; while(strcmp(cmpstr,str)!=0){ randomize(str); puts(str); sleep(1); } return 0; }
注:主循环的近乎无限不是问题,核心问题出在__rand_char()函数上。
解答
srand(time(0))重复调用是致命问题:每次调用__rand_char()都重置随机数生成器,而time(0)返回的是秒级时间戳。同一秒内多次调用的话,每次初始化的种子都一样,生成的随机数完全相同,自然返回同一个字符。正确做法是把srand(time(0))放在main()开头,整个程序只初始化一次。字符指针
l本身没问题:你说无法打印或获取长度,应该是操作错了。打印l直接用puts(l)就能输出整个字母串;长度用strlen(l)就能拿到,固定是26,因为它指向的是字面量字符串。randomize()函数逻辑彻底走不通:初始时str被memset成全0,第一次循环判断*(str+0)就是'\0',counter自增到1后直接退出循环,根本不会执行赋值语句。这导致str永远是全0,不可能匹配目标字符串。要么改成按固定长度(11个字符)循环赋值,要么初始化str为非空字符串再替换。
内容的提问来源于stack exchange,提问作者FariyaAchhab
相关产品推荐
相关产品推荐

