C:程序在从char函数中删除printf后打印输出中的奇怪内容

时间:2017-09-30 04:24:35

标签: c encryption

我正在用c编写程序用于vignere密码,当在一个函数中生成密钥作为相同长度的输入名称时,我遇到了一个错误,如果我删除了“printf”行显示输入字符串的长度呢,在sceen上打印奇怪的东西,只有当我从GenKey()函数中删除“printf”行时才会发生。

Supplier

输出(删除该行之前):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *GenKey(char *key, char *source){
    int i=0,j=0;
    char ReturnKey[strlen(source)];

    printf("%d\n",strlen(source));      // THIS LINE HERE CAUSES PROBLEM

    for(i=0;i<strlen(source)-1;i++){
        if(j==strlen(key)){
            j=0;
        }
        ReturnKey[i]=key[j];
        j++;
        }
        return ReturnKey;
}

int main()
{
    int i;
    char name[10000];
    char container[10000];
    char VigKey[]="INFERNO";
    char *NamePtr;
    char *KeyPtr;
    printf("give a name: ");
    fgets(name,10000,stdin);

    char GeneratedKey[strlen(name)];
    KeyPtr=VigKey;
    NamePtr=name;
    strcpy(GeneratedKey,GenKey(KeyPtr,NamePtr));
    printf("%s",GeneratedKey);
}

现在我删除该行

give a name: ATTACKATDAWN
13
INFERNOINFER

输出(删除该行后):

char *GenKey(char *key, char *source){
    int i=0,j=0;
    char ReturnKey[strlen(source)];

   // NOW I HAVE DELETED THAT LINE

    for(i=0;i<strlen(source)-1;i++){
        if(j==strlen(key)){
            j=0;
        }
        ReturnKey[i]=key[j];
        j++;
        }
        return ReturnKey;
}

1 个答案:

答案 0 :(得分:1)

尝试使用malloc在堆上创建ReturnKey字符数组:

char *GenKey(char *key, char *source){
    int i=0,j=0;
    char *ReturnKey = malloc(sizeof(char) * strlen(source));
    for(i=0;i<strlen(source)-1;i++){
        if(j==strlen(key)){
            j=0;
        }
        ReturnKey[i]=key[j];
        j++;
    }
    return ReturnKey;
}

在创建ReturnKey之前,您正在将其作为仅存在于该函数上下文中的局部变量。即使你会看到你的单词仍在那里,那只是因为它仍然在内存中的那个位置,但不再被一个对象引用。

当您使用类似malloc的函数创建动态数组时,您将在所谓的&#34;堆&#34;上创建它。当它超出范围时,它不会被释放,这样你就可以从函数中返回它(你实际上在内存中返回指向该位置的指针)。

当使用malloc注意内存未被释放时,因此您必须在某个时候通过免费调用自己释放它,否则您将泄漏内存。

这就是完整代码的样子:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *GenKey(char *key, char *source){
    int i=0, j=0;

    // malloc takes the size of the data type * the length
    char *ReturnKey = malloc(sizeof(char) * strlen(source));

    for(i=0;i<strlen(source)-1;i++){
        if(j==strlen(key)){
            j=0;
        }
        ReturnKey[i]=key[j];
        j++;
    }
    return ReturnKey;
}

int main()
{
    int i;
    char name[10000];
    char container[10000];
    char VigKey[]="INFERNO";
    char *NamePtr;
    char *KeyPtr;
    printf("give a name: ");
    fgets(name,10000,stdin);

    KeyPtr=VigKey;
    NamePtr=name;
    char *GeneratedKey = GenKey(KeyPtr,NamePtr);
    printf("%s",GeneratedKey);
    free(GeneratedKey);  // IMPORTANT!!!
}

这是一篇关于使用malloc和free的更深入的文章:

https://www.codingunit.com/c-tutorial-the-functions-malloc-and-free