【问题标题】:My Random Password Generator throws an error. How do I fix this?我的随机密码生成器引发错误。我该如何解决?
【发布时间】:2019-12-06 04:37:44
【问题描述】:

我用 C 语言编写了一个随机密码生成器。但是我的代码抛出了一个错误。问题是什么?我该如何解决?

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

int main()
{   
    srand((unsigned int)(time(NULL)));
    int k_sayi,i;
    srand((unsigned int)(time(NULL)));
    char kucuk_harf[26]="abcdefghijklmnoprstuvwxyz";
    char buyuk_harf[26]="ABCDEFGHIJKLMNOPRSTUVWXYZ";
    char sayilar[11]="1234567890";
    char ozel_karakter[13]="!'^+%&/=?_*";
    char *pass;

    printf("Parola kac karakterli olsun?: ");
    scanf("%d",&k_sayi);

    pass=(char *)malloc(k_sayi*sizeof(char));

    for(i=0;i<k_sayi;i++){
        pass[i]=rand()%(sizeof kucuk_harf);
    }
    pass[i]='\0';
    printf("%s",pass);

    return 0;
}

【问题讨论】:

  • 那是什么错误
  • 别忘了free()

标签: c password-generator


【解决方案1】:

你需要这样做,否则会出现越界读写:

pass = malloc(k_sayi+1);

您还需要这样做才能获得可读的 ASCII 字符:

pass[i] = kucuk_harf[rand() % strlen(kucuk_harf)];

另外,删除您的两个 srand 调用并在 char *pass; 之后放置一个,以使您的代码符合 ANSI。

这是已注释掉未使用变量的代码的工作版本:

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

int main()
{
    int k_sayi,i;
    char kucuk_harf[]="abcdefghijklmnoprstuvwxyz";
/*    char buyuk_harf[]="ABCDEFGHIJKLMNOPRSTUVWXYZ"; */
/*    char sayilar[]="1234567890"; */
/*    char ozel_karakter[]="!'^+%&/=?_*"; */
    char *pass;

    srand(time(NULL));

    printf("Parola kac karakterli olsun?: ");
    scanf("%d", &k_sayi);

    pass = malloc(k_sayi+1);

    for(i=0;i<k_sayi;i++){
        pass[i] = kucuk_harf[rand() % (sizeof(kucuk_harf) - 1)];
    }

    pass[i]='\0';
    puts(pass);

    /* make sure to free */
    free(pass);

    return 0;
}

【讨论】:

    【解决方案2】:

    如果你改变了

    for(i=0;i<k_sayi;i++){
            pass[i]=rand()%(sizeof kucuk_harf);
        }
    

    for(i=0;i<k_sayi-1;i++){
            pass[i]=rand()%(sizeof kucuk_harf);
        }
    

    它应该可以工作。

    如果您有一个大小为n 的数组,您可以从0 遍历它到n-1
    您已经在 for 循环中执行此操作,但随后想要访问 pass[i],这超出了范围。

    【讨论】:

    • @JL2210 假设 k_sayi 是 10。然后 for 循环从 0 变为 9。并在最后一次运行循环后将 i 设置为 10。之后他说pass[i]='\0';i10,所以越界
    • 是的,但他应该malloc(k_sayi+1);
    猜你喜欢
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 2012-11-06
    • 2017-12-19
    • 2021-05-21
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多