【问题标题】:在c中随机生成一个名字
【发布时间】:2022-01-23 16:48:21
【问题描述】:
 signed char *tab_alphabet[]={"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","\0"};

int nombreAlea(int min, int max){
      return (rand()%(max-min+1) + min);
    }
void generer_name(int length,signed char* n){
  int i ;
  signed char *j;
  for (i=0;i<length;i++){
    int k = nombreAlea(1,26);// from the table of the alphabet
    j = tab_alphabet[k-1];
    strcat(n,j); 
  }
}

这里是主要的:

int main () {
    int a = nombreAlea(4,30);
   signed char *nn;
    generer_name(a,nn);
    return 0 ;
}

问题是结果总是以 "a!!@" 开头,任何帮助,我对 strcat 有疑问

【问题讨论】:

  • 你需要调用 srand 来初始化一个不同的随机生成器
  • nn 不是字符串。所以n 不是字符串。所以strcat 不好
  • 所以开始做:signed char *nn; --> signed char nn[31] = "";`
  • 最好的建议是......编译时带有高度警告。对于gcc 使用-Wall -Wextra -Werror -pedantic 并修复所有报告的问题

标签: c random char


【解决方案1】:

您需要使用不同的值调用 srand,经典方法是为此使用时间。

使用足够大的 char[] 来存储生成的字符串

使用简单的字符串作为字母。

#include <time.h>
#include <stdlib.h>
#include <stdio.h>


char *tab_alphabet="abcdefghijklmnopqrstuvwxyz";

int nombreAlea(int min, int max){
    return (rand()%(max-min+1) + min);
}
void generer_name(int length, char n[]){
    int i ;
    for (i=0;i<length;i++){
        int k = nombreAlea(1,26);// from the table of the alphabet
        n[i] = tab_alphabet[k-1];
    }
    n[i] = '\0';
}

int main (void) {
    char nn[64];
    int a;
    srand( time( NULL ) );
    a = nombreAlea(4, 30);
    generer_name(a, nn);
    printf(" >%s<\n", nn);
    return 0 ;
}

【讨论】:

  • 吹毛求疵:没有理由拥有tab_alphabet。只需将其删除并将int k = nombreAlea(1,26); n[i] = tab_alphabet[k-1];更改为int k = nombreAlea(0,25); n[i] = 'a' + k;
  • 也许他想用另一个,这里是一个简化
  • 例如在密码生成器上我删除了l I 0 O 以避免混淆
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 2011-02-17
  • 2011-10-26
相关资源
最近更新 更多