我正试图将密码加扰器从Javascript复制到C。它所做的是获取字母的ASCII字符代码,对其进行分解,然后从给定列表中获取一个随机字符。
Javascript版本:

function getScrambledPassword(pwd) {
    var cipher = ['k', 's', 'z', 'h', 'x', 'b', 'p', 'j', 'v', 'c', 'g', 'f', 'q', 'n', 't', 'm'];
    var result="";
    if (pwd == null)
        pwd = "";
    pwd = encodeURIComponent(pwd);
    //alert("encoded password: " + pwd);
    for(var i=0;i<pwd.length;i++) {
            var cc = pwd.charCodeAt(i);
        result += cipher[Math.floor(cc/16)] + cipher[cc%16];
    }
    //alert("scrambled password: " + result);
    return result;
}

正在运行的扰频器示例:https://jsfiddle.net/w5db66va/
到目前为止我所做的:
#include <stdio.h>
#include <math.h>
#include <string.h>

static char *scramblePassword(char *pwd)
{
    char *cipher[] = {
        "k", "s", "z", "h",
        "x", "b", "p", "j",
        "v", "c", "g", "f",
        "q", "n", "t", "m"
    };

    char *result = "";
    for(int i=0; i < strlen(pwd); i++)
    {
        int cc = (int) pwd[i];
        printf("%d", cc);
        result + cipher[floor(cc/16)] + cipher[cc%16];
    }
    return *result;
}

int main(void)
{
    char *test[] = {"test", "testtwo", "testthree"};
    for (int i=0;i < sizeof(test); i++)
    {
        printf("Original: %s", test[i]);
        printf("Scrambled: %s", scramblePassword(test[i]));
    }
}

我遇到的问题是,当我运行c文件(在编译之后)时,它根本不会输出任何内容。我做错了什么,以至于我不能让它像我期望的那样运行?

最佳答案

从评论开始,你的问题比你最初想象的要深一些。首先,您不希望cipher是字符串数组,您只希望它是字符数组,例如:

    char cipher[] = "kszhxbpjvcgfqnm";

接下来,不能返回在函数体中声明的数组。当result返回时,scramblePassword的内存被破坏。您的选择是(1)在result中动态分配scramblePassword(并在main中释放它),或(2)在result中声明main的存储并将其作为参数传递给scramblePassword。例如。:
#define MAX 32

static char *scramblePassword (char *pwd, char *result)
{
 ...
    return result;
}

int main(void)
{
    char result[MAX] = "";
    ...
        printf ("Scrambled: %s\n", scramblePassword (test[i], result));

最后,如果您的算法打算从cipher构建一个加扰字符数组,将导致选择超出cipher界限的索引,从而导致未定义的行为。如果目的是将一个值赋给result[x]而不管它是否是有效的可打印的ASCII值,那么它可能是正常的。但是,如果第一个是您的目标,则算法的结果必须始终产生一个在cipher范围内的值,例如:
         result[i] = cipher[((int)floor (cc / 16) + cc % 16) % sizeof cipher];

将所有这些片段放在一起,并回忆一下main是类型int并因此返回一个值,您可以执行如下操作:
#include <stdio.h>
#include <math.h>
#include <string.h>

#define MAX 32

static char *scramblePassword (char *pwd, char *result)
{
    char cipher[] = "kszhxbpjvcgfqnm";
    int i;

    for (i = 0; i < (int)strlen (pwd); i++)
    {
        int cc = (int) pwd[i];
        // result[i] = cipher[(int)floor (cc / 16)] + cipher[cc % 16];
        result[i] = cipher[((int)floor (cc / 16) + cc % 16) % sizeof cipher];
    }
    result[i] = 0;  /* you MUST nul-terminate to use as a string */

    return result;
}

int main(void)
{
    char *test[] = {"test", "testtwo", "testthree"};
    char result[MAX] = "";

    for (int i = 0; i < (int)(sizeof test/sizeof *test); i++)
    {
        printf ("\nOriginal : %s\n", test[i]);
        printf ("Scrambled: %s\n", scramblePassword (test[i], result));
    }

    return 0;
}

示例使用/输出
这将导致可读输出:
$ ./bin/pwscramble

Original : test
Scrambled: ffgf

Original : testtwo
Scrambled: ffgffmb

Original : testthree
Scrambled: ffgffmcff

我把它留给你去研究那个算法到底应该做什么。如果你还有问题,请告诉我。

关于javascript - 创建密码加扰器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43143301/

10-09 18:30