这是一个使用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。参见here。
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#@$#
编辑:对不起,我忘了说我从编译器得到了很多警告。警告本身并不能帮助我理解我做错了什么-我真的是C的新手。我回家后会贴警告的。
5条答案
按热度按时间fykwrbwg1#
已经有很多关于
char **
和char *
之间差异的反馈,不需要重复。虽然根据需要多次打开/关闭函数中的文件似乎很方便,但这确实给操作系统带来了负担,并且会减慢执行速度。此外,平均而言,程序将读取1/2的方式进入文件之前,找到正在寻找的标记。重复此6次(6个单词)将像阅读整个文件3次。浪费。
由于文件并不大,因此完整地加载一次似乎是有意义的。然后,它可以重复扫描感兴趣的目标。(此代码假定文件中的最后一个字符将是最后一个单词末尾的'\n'。
像@NoDakker一样,我不使用Sodium,所以我设计了一种替代方法来生成5个ASCII数字的字符串,代表5卷骰子。
输出量:
i7uq4tfw2#
根本原因是
应当
由于ptr指向word1的地址,它将开始处理所有类型的数据。一旦你解决了这个问题,下一个问题是
其目的可能是将SQL Server的内容复制到Word中,因此,
如果你打开编译器警告,它应该告诉你这些。
sg24os4d3#
我很惊讶编译器没有因为不匹配的类型而向你抱怨。
在函数 get_word() 中:
在指针字所指向的位置将类型(char*)(指针)赋给类型(char)。我想你的意思是:
np8igboo4#
一大堆问题。
*word = wordline;
你用指针分配整数。可能你想修改传递给函数的指针。你需要将这个参数声明为指针到指针来实现它。
1.即使你改变它。分配的指针将引用本地数组,当函数返回时,该数组将停止存在。
1.即使你把
line
设为静态,你也会打印出word1
,它不会通过赋值指针进行修改。解决方案:
你需要将字符串复制到参数中(保持其类型为
char *
):而不是
*word = wordline;
->strcpy(word, wordline);
xyhw6mcr5#
与其他答案和注解一样,我注意到编译器警告,这些警告表明您试图引用“指向指针的指针”,而不是引用字符数组名称,这实际上是指向数组的指针。
回顾一下程序的预期用途,下面是代码的重构版本。
需要注意的几点:
有了所有这些,以下是一些测试在终端的输出数据。
因此,要认识到指针引用如何与字符数组一起使用。你可能想做一些进一步的教程研究这个概念。