我现在正在学习如何用C写代码。我有一些代码,应该生成一个“密码”的随机字符,并将其保存到一个文件。好像写入文件的密码被切断了。
下面是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
int main(){
int i = 0;
char password[65536];
char chars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_-+={[]}\\|;:'\",<.>/?`~!@#$^&*()";
int size;
char path[512];
printf("Where should the key be saved? ");
fgets(path, sizeof(path), stdin);
path[strcspn(path, "\n")] = 0;
Sleep(500);
printf("How long should the key be? (max 65535) ");
scanf("%d",&size);
if(size >= sizeof(password)) {
printf("Size is too large\n");
return 1;
}
getchar();
srand((unsigned int)(time(NULL)));
for (i = 0; i < size; i++){
int choice = rand() % sizeof(chars);
printf("%c",chars[choice]);
password[i] = chars[choice];
}
password[size] = '\0';
FILE* fptr = fopen(path,"w");
if (fptr == NULL) {
printf("Failed to open file for writing\n");
return 1;
}
fprintf(fptr, "%s", password);
fclose(fptr);
}
以下是此问题的一个示例:
输入长度:5000
打印:bWe... Ux<.../[P
已保存到文件:bWe...Ux<
我希望它能写完整的密码,但正如我试图在上面显示的那样,它在某个时候被切断了。
它似乎也在每次不同的点被切断。
1条答案
按热度按时间igetnqfo1#
chars
中只有93个有用的字符(包括索引0到92)。当使用use
rand() % 94
时,偶尔会得到值93,这是字符串末尾\0
的索引。因为你使用
fprintf("%s")
来打印它,它将在字符串的末尾停止,这是它看到的第一个\0
。因此,它在随机的地方切断,因为它随机选择了
\0
,概率大约是九十分之一:-)最好使用
strlen(chars)
,而不是神奇的94
值。