在C中写入文件切断

6ovsh4lw  于 2023-06-21  发布在  其他
关注(0)|答案(1)|浏览(128)

我现在正在学习如何用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<
我希望它能写完整的密码,但正如我试图在上面显示的那样,它在某个时候被切断了。
它似乎也在每次不同的点被切断。

igetnqfo

igetnqfo1#

chars中只有93个有用的字符(包括索引0到92)。
当使用use rand() % 94时,偶尔会得到值93,这是字符串末尾\0的索引。
因为你使用fprintf("%s")来打印它,它将在字符串的末尾停止,这是它看到的第一个\0
因此,它在随机的地方切断,因为它随机选择了\0,概率大约是九十分之一:-)
最好使用strlen(chars),而不是神奇的94值。

相关问题