指针和字符串出现问题,打印出乱码

问题描述 投票:0回答:2

这是一个使用 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#@$#
c pointers
2个回答
0
投票

问题很多。

  1. *word = wordline;

您用指针分配整数。也许您想修改传递给函数的指针。您需要将此参数声明为指向指针的指针。

int get_word(char *combo, char *word)
  1. 即使你改变它。分配的指针将引用本地数组,当函数返回时,该数组将不再存在。

  2. 即使您将

    line
    设为静态,您也会打印
    word1
    ,它不会通过分配指针而修改。

解决方案:

您需要将字符串复制到参数中(保持其类型为

char *
):

而不是

*word = wordline;
->
strcpy(word, wordline);


0
投票

令我惊讶的是编译器没有向您抱怨类型不匹配。

在函数 get_word() 行中:

*word = wordline;

将类型(char*)(一个指针)分配给指针word指向的位置的类型(char)。我认为你的意思是:

strcpy(word, wordline);
© www.soinside.com 2019 - 2024. All rights reserved.