密码生成器显示池中未出现的符号

时间:2015-03-06 12:02:08

标签: c

我编写了一个密码生成器,有时似乎表现得很尴尬。当我启动程序时,我有时输出如下:

  

密码:pyi> Sx2Z

我实际上排除了"大于"焦炭。我甚至打印了游泳池中的每一个可用的字符,并且"大于" char没有发生。我有点困惑。我感谢任何帮助或解释。提前致谢。 这是我的代码:

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

#define STARTNUMBER     '0'
#define ENDNUMBER       '9'
#define STARTUPLETTER   'A'
#define ENDUPLETTER     'z'
#define STARTLOWLETTER  'a'
#define ENDLOWLETTER    'z'
#define SIZE            (2*26+10)
#define DEBUG

int main(int argc, char** argv)
{
  srand(time(0));
  int defaultLenght = 8;
  if(argc == 2)
  {
    defaultLenght = atoi(argv[1]);
  }
  char pool[SIZE];
  char password[defaultLenght];
  char digitCount = ENDNUMBER - STARTNUMBER + 1;
  for(int c = 0; c < digitCount; c++)
  {
    pool[c] = STARTNUMBER + c;
  }
  char upLetterCount = ENDLOWLETTER - STARTUPLETTER + 1;
  for(int c = 0; c < upLetterCount; c++)
  {
    pool[digitCount + c] = STARTUPLETTER + c;
  }
  char lowLetterCount = ENDLOWLETTER - STARTLOWLETTER + 1;
  for(int c = 0; c < lowLetterCount; c++)
  {
    pool[digitCount + lowLetterCount + c] = STARTLOWLETTER + c;
  }
#ifdef DEBUG
  for(int i = 0; i < SIZE; i++)
  {
    printf("%c", pool[i]);;
  }
  printf("\r\n");
#endif
  printf("password: ");
  for(int i = 0; i < defaultLenght; i++)
  {
    int index = rand() % SIZE + 1;
    password[i] = pool[index];
    pool[index] = pool[SIZE -i -1];
    putchar(password[i]);
  }
  printf("\r\n");
  return(0);
}

1 个答案:

答案 0 :(得分:3)

使用

将随机索引选入池中时出错
int index = rand() % SIZE + 1;

1..SIZE范围内的数字混合,但池需要0..(SIZE-1)范围内的索引。这可能导致选择阵列外的下一个字符。那条线应该是

int index = rand() % SIZE;

但是您的密码选择还有另一个问题。您可以使用池数组中的另一个字符覆盖所选字符,可能是为了防止它被选中两次,但是您不会减小池的大小。我建议这个:

int poolsize = SIZE;
for(int i = 0; i < defaultLenght; i++)
{
    int index = rand() % poolsize;
    password[i] = pool[index];
    pool[index] = pool[--poolsize];
    putchar(password[i]);
}