大家好,我改善了我的代码。
这段代码适用于任何数量的字符,但是当我传递诸如“〜`!@#$%^&*()_- = +]} [{'”;:。,>“和没有输出,如果我仅传递字符和数字,我将获得所需的输出。
谁能帮我这个。
在此先感谢,这是我的代码。
这是我的代码。现在我已经动态分配数组,然后再将其传递给函数
#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()
进行动态内存分配。附带说明:如果正确启用了警告,则编译器通常会针对此类错误发出警告,您可以通过侦听编译器来避免许多错误。