函数只工作一次-C

函数只工作一次-C,c,winapi,encryption,xor,C,Winapi,Encryption,Xor,我一直在尝试制作一个基本的XOR头文件,以便在将来的一些程序中使用。到目前为止,我已经完成了几乎所有的工作,但我似乎不能两次使用同一个函数。如果我调用函数来加密字符串,它会工作,但是如果我再次调用它,它会崩溃。我不知道我在记忆方面是做错了什么,还是遗漏了一些明显的东西。希望有人能指出其中的一个缺陷,因为我似乎没有发现任何错误 编辑:如果发布的内容太多,请随意修改代码。我已经拿出了不少,所以我不只是粘贴我的项目,并希望有人修复它 // Main.c #define MAX_LENGTH 255 #

我一直在尝试制作一个基本的XOR头文件,以便在将来的一些程序中使用。到目前为止,我已经完成了几乎所有的工作,但我似乎不能两次使用同一个函数。如果我调用函数来加密字符串,它会工作,但是如果我再次调用它,它会崩溃。我不知道我在记忆方面是做错了什么,还是遗漏了一些明显的东西。希望有人能指出其中的一个缺陷,因为我似乎没有发现任何错误

编辑:如果发布的内容太多,请随意修改代码。我已经拿出了不少,所以我不只是粘贴我的项目,并希望有人修复它

// Main.c
#define MAX_LENGTH 255
#define KEY_SIZE 8
int main(int argc, char *argv[]) {
    //Get String to XOR
    char *input = malloc (MAX_LENGTH);
    printf("Enter a string to encrypt: ");
    fgets(input, MAX_LENGTH, stdin);

    if(input[strlen (input) - 1] == '\n') {
        input[strlen (input) - 1] = '\0';
    }

    //Create a random key
    char *pass = _create_key(KEY_SIZE);
    int len = strlen (input);
    printf("Length of key is %d\n", KEY_SIZE);
    printf("Entered String: %s - Password: %s\n", input, pass);

    //Encrypt works fine
    char *encrypted = malloc (sizeof (input));
    _xor_str_s(input, pass, len, encrypted);
    printf("Encrypted String: %s\n", encrypted);

    char *decrypted = malloc (sizeof (input));
    //Crashes here
    _xor_str_s(encrypted, pass, len, decrypted);
    printf("Decrypted String: %s\n", decrypted);
    return 0;
}

//Header File Function
void _xor_str_s(char *str, char *pass, int len, char *out) {
    int i = 0;
    for(i = 0; i < len; i++) {
        *(out + i) = str[i] ^ pass[i % strlen (pass)];
    }
    *(out + i) = 0;
}

char * _create_key(int len) {
    len = !len ? 16 : len;
    char *ret = (char *)malloc (len);
    unsigned int _GLOBAL_SEED_ = (unsigned int)time(NULL);
    srand (_GLOBAL_SEED_);
    int i = 0;
    for(i = 0; i < len; i++) {
        ret[i] = (char)(rand() + 1); //+1 avoids NULL
    }
    ret[i] = '\0';
    return ret;
}
//Main.c
#定义最大长度255
#定义键大小8
int main(int argc,char*argv[]){
//获取字符串到异或
char*input=malloc(最大长度);
printf(“输入要加密的字符串:”);
fgets(输入,最大长度,标准输入);
如果(输入[strlen(输入)-1]='\n'){
输入[strlen(输入)-1]='\0';
}
//创建一个随机键
char*pass=\u创建\u键(键大小);
int len=strlen(输入);
printf(“密钥长度为%d\n”,密钥大小);
printf(“输入的字符串:%s-密码:%s\n”,输入,通过);
//加密工作正常
char*encrypted=malloc(sizeof(输入));
_xor_str_s(输入、传递、len、加密);
printf(“加密字符串:%s\n”,加密);
char*decrypted=malloc(sizeof(输入));
//在这里撞车
_xor_str_s(加密、通过、len、解密);
printf(“解密字符串:%s\n”,已解密);
返回0;
}
//头文件函数
void\u xor\u str\s(char*str,char*pass,int len,char*out){
int i=0;
对于(i=0;i
这可能是问题所在,因为这总是
sizeof(char*)
。我想你想要

char *encrypted = malloc (strlen (input) + 1);

您收到的错误消息是什么?没有编译错误,它只是在运行时崩溃而没有消息。我应该补充的另一件事是,它适用于4个字母的单词和其他一些长度,但总是在任何可被8整除的单词和其他一些随机长度上崩溃。还有一件事让我想知道发生了什么。你在
\uxor\ustr\uS
中缺少了一个
NULL
引用检查。在调用
malloc
后,始终检查
NULL
。@torrentialcoding,我认为这不会是我目前遇到的问题,因为函数无论如何都会设置数据。不管怎样,我做了一次检查,第二次传递的变量中没有一个是
NULL
@ozdrgnadies,我不是说这是问题所在。我只是想指出,在
malloc
之后,您需要检查
NULL
以确保分配成功。这是一个很好的例子,说明当您确定错误是正确的时,掩盖错误是多么容易。这立刻解决了问题。有一双新鲜的眼睛来发现这类东西总是好的。谢谢你的回答!
char *encrypted = malloc (strlen (input) + 1);