这是一个使用 libsodium 的密码(骰子软件)生成器。
get_word 函数应该将选定的单词(字符串)写入作为参数传递的指针
char *word
,但它不起作用。相反,会打印乱码 - 随机字符。当它打印第一个单词时你可以看到这一点。
#include <stdio.h>
#include <string.h>
#include <sodium.h>
void roll_dice(char *combo) {
uint32_t dice1, dice2, dice3, dice4, dice5;
uint32_t upper = 6;
dice1 = randombytes_uniform(upper) + 1;
dice2 = randombytes_uniform(upper) + 1;
dice3 = randombytes_uniform(upper) + 1;
dice4 = randombytes_uniform(upper) + 1;
dice5 = randombytes_uniform(upper) + 1;
sprintf(combo, "%d%d%d%d%d", dice1, dice2, dice3, dice4, dice5);
}
int get_word(char *combo, char *word) {
FILE *stream;
char line[20];
char *wordline;
stream = fopen("/usr/local/etc/passwiz/eff_large_wordlist.txt", "r");
if (NULL == stream) {
printf("Failed to open wordlist\n");
return -1;
}
while (fgets(line, sizeof(line), stream)) {
wordline = strstr(line, combo);
if (wordline > 0) {
// TODO: slice the string to obtain just the word
//wordline = strtok(wordline, "\t");
//wordline = strtok(wordline, "\t");
*word = wordline;
}
}
fclose(stream);
}
int main(void) {
if (sodium_init() < 0) {
return 1;
}
char combo[6];
roll_dice(combo);
printf("Dice numbers: %s\n", combo);
char word1[20];
char *ptr = &word1;
if (get_word(combo, ptr) < 0) {
return 1;
}
printf("First word: %s\n", word1);
// TODO: get 6 words
}
我使用的词汇表来自 EFF。请参阅此处。
11111 abacus
11112 abdomen
11113 abdominal
11114 abide
11115 abiding
11116 ability
11121 ablaze
11122 able
11123 abnormal
11124 abrasion
11125 abrasive
up to 66666
运行时看到的标准输出示例:
Dice numbers: 32345
First word: 3#@$#
问题很多。
*word = wordline;
您用指针分配整数。也许您想修改传递给函数的指针。您需要将此参数声明为指向指针的指针。
int get_word(char *combo, char *word)
即使你改变它。分配的指针将引用本地数组,当函数返回时,该数组将不再存在。
即使您将
line
设为静态,您也会打印 word1
,它不会通过分配指针而修改。
解决方案:
您需要将字符串复制到参数中(保持其类型为
char *
):
而不是
*word = wordline;
-> strcpy(word, wordline);
令我惊讶的是编译器没有向您抱怨类型不匹配。
在函数 get_word() 行中:
*word = wordline;
将类型(char*)(一个指针)分配给指针word指向的位置的类型(char)。我认为你的意思是:
strcpy(word, wordline);