You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

字符串随机器运行异常:__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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 00:40:28