大家好,我改善了我的代码。
这段代码适用于任何数量的字符,但是当我传递诸如“〜`!@#$%^&*()_- = +]} [{'”;:。,>“和没有输出,如果我仅传递字符和数字,我将获得所需的输出。
谁能帮我这个。
在此先感谢,这是我的代码。

这是我的代码。现在我已经动态分配数组,然后再将其传递给函数

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

void OriginalHex(int *buffer,int size,char *string)
{
    int i;
    for (i=0;string[i]!='\0';i++)
    {
        if(string[i] >= '0' && string[i] < 'A')
            buffer[i] = string[i] - '0';
        else if (string[i] >= 'A')
            buffer[i] = string[i] - 'A' + 10;
    }
}

void PackingTheHex(int *hex,int size,int *string)
{
    int i=0,j=0;
    for (i=0,j=0;i<size;i+=2,j++)
        hex[j] = string[i]<<4 | string[i+1];
}


void HexToDec(int *newHex,int len,int *string)
{
    int i=0,j,temp=0x00,l;
    int mask = 0xFF;

    for (i=0,j=0,l=0;i<len/2;i++,j++,l++)
    {
        if(j==8)
        {
            newHex[l] = temp & 0x7f;
            temp = temp>>7;
            j=1;
            l+=1;
        }
        newHex[l] = ((string[i] & (mask>>j+1)) << j) | temp;
        temp = string[i] >> (7-j);
    }
}




int main(void)
{
    int i;
    char userString[512];

    printf("\nEnter 8-Bit Packed Form String: ");
    gets(userString);
    printf("\n\nYou have Entered %s",userString);

    int stringLen = strlen(userString);

    printf("\n\nOringinal Hex: ");
    int *hex = (int*)malloc(sizeof(int)*stringLen);
    OriginalHex(hex,stringLen,userString);
    for (i=0;i<stringLen;i++)
        printf("%d ",hex[i]);

    printf("\n\nPacking The Hex: ");
    int *newHex = (int*)malloc(sizeof(int)*stringLen);
    PackingTheHex(newHex,stringLen,hex);
    for (i=0;i<stringLen/2;i++)
        printf("%d ",newHex[i]);
    free(hex);


    printf("\n\nHex to Decimal Values are: ");
    int *decHex = (int*)malloc(sizeof(int)*stringLen);
    HexToDec(decHex,stringLen,newHex);
    stringLen = stringLen + stringLen/8;
    for (i=0;i<stringLen/2+1;i++)
        printf("%d ",decHex[i]);
    free(newHex);

    char *ASCIIchar = (char*)malloc(sizeof(char)*stringLen);
    for (i=0;i<stringLen/2+1;i++)
        ASCIIchar[i] = (char)decHex[i];
    ASCIIchar[i] = '\0';
    printf("\n\nOriginal sentence is: %s",ASCIIchar);
    free(decHex);
    free(ASCIIchar);

}

最佳答案

在PackingToHex中,您将返回一个具有自动存储持续时间的局部变量:

int* PackingToHex(int *string,int len)
{
    int newHex[512];
    ...
    return (&newHex[0]);
}


newHex的生存期随着函数的返回而终止,并且存储空间通常在过程堆栈中会被重用。函数HexToDec()遇到同样的问题。

根据情况,一个快速的解决方法是使用静态存储:

static int newHex[512];


在这种情况下,newHex的生存期不受限制,但是必须记住,只有一个存储,每次对PackingToHex()的新调用都会覆盖该存储。如果存在问题,则必须使用malloc()/free()进行动态内存分配。

附带说明:如果正确启用了警告,则编译器通常会针对此类错误发出警告,您可以通过侦听编译器来避免许多错误。

10-08 16:41