指针解除引用,指针不好

时间:2013-07-28 09:38:02

标签: c pointers

我正在尝试编程一个encrptor和decryptor。我的问题是我指定值的指针仍然具有与第二个相同的值。我试图免费使用,但问题仍然是一样的。 例如,我输入了aslkdjlasc(仅限样本) 输出将是: 的HelloWorld

我尝试再次运行程序,然后输入daskjda 输出就像 doctorxRLD

RLD来自此指针的过去值。它应该只有7个字符,但由于helloworld是10,前7个字母被加密取代,但最后3个字符仍然打印。

我该怎么办?

更新:此处是本守则的一部分:

void encrypt(char *crypt)
{
char *plaintext,*encryption,slash=0x2F;
int i,j,k,flags,f;
encryption=(char *)malloc(sizeof(int));
plaintext=(char *)malloc(sizeof(int));
printf("Enter plaintext, spaces,commas,and dots should be represented as /:\n");
scanf("%s",&*plaintext);
for(i=0;i<strlen(plaintext);i++)
{
    j=1;flags=0;
    while(j<53 && flags==0)
    {
        if(plaintext[i]==slash)
        {
            encryption[i]=slash;
            flags=1;
        }
        if(plaintext[i]==crypt[j])
        {
            encryption[i]=crypt[j-1];
            flags=1;
        }
        k=j+2;
        j=k;
    }
}
printf("%s",encryption);
    free(encryption);
    free(plaintext);
getch();
}

这里是主要的

main()
{
char c;
int timer;
char crypt[53]="***i have hidden my encryption code***";
clrscr();
printf("Press e to encrypt, d to decrypt, ESC to exit.\n");
c=getch();
switch(c)
{
    case(0x1b):
        exit(0);
        break;
    case(0x64):
        decrypt(crypt);
        break;
    case(0x65):
        encrypt(crypt);
        break;
    default:
        printf("INVALID. FORCE EXIT IN 3 SEC0NDS.");
        delay(3000);
        exit(0);
}

getch();
}

2 个答案:

答案 0 :(得分:1)

在您的代码中,您为字符串分配整数大小(4个字节)的内存

当你这样做时

plaintext=(char *)malloc(sizeof(int));

然后通过这样做

scanf("%s",&*plaintext);

您可能正在扫描超过四个字符的字符串(但是您只分配了四个字节)

scanf("%s",&*plaintext);相当于scanf("%s",plaintext);(前面的语句表示您正在添加不必要的计算。

答案 1 :(得分:0)

是的,是我。我已经知道了。感谢您的所有评论,但有些是严厉的。哈哈

  1. 我没有使用malloc,因为显然DCoder指出我不知道如何使用它们。
  2. 谢谢Sanyam Goel我也修好了我的scanf。
  3. 我只使用了2个指针而不是4个。我所做的是在主函数中实例化它们,而不是在每个decrpyt和encrypt函数中实例化它们。像这样:

    main() { char c,*from, *to; ..........

    void encrypt(char *crypt,char *plaintext,char *encryption)

    void encrypt(char *crypt,char *ciphertext,char *decryption)

  4. 所以当我打电话给他们中的任何一个时,我只是说:

        case(0x64):
            decrypt(crypt,from,to);
            break;
        case(0x65):
            encrypt(crypt,from,to);
            break;
    

    在主要功能的开关结束时:

        free(from); from=NULL;
        free(to); to=NULL;
    

    所以现在我已经删除了不必要的指针和额外的进程。

    谢谢大家。 :)