在C中将字符串转换为十六进制时遇到问题

时间:2012-04-09 23:33:39

标签: c pointers hex decimal

我正在编写代码以解决将十进制转换为十六进制的问题。

void decToHex (char *decString){
    char hexVal[100];
    sprintf(hexVal,"%x", *decString);
    *decString = hexVal;
    return;
}
  

编译错误:警告:赋值从整数生成指针   没有演员表(默认启用);说到“* decString”这一行   = hexVal;“我试图将指针值设置为新发现的十六进制值。

有谁知道我做错了什么?我已经读过一些其他帖子,说这可能是编译器的一个问题,但是我们的类要求我们使用内置在putty服务器中的标准c99编译器。关于如何做到这一点的任何想法?我也尝试根据模数16的想法创建一个int数组,但我还有更多的问题。

4 个答案:

答案 0 :(得分:2)

*decString是一个字母。 hexVal(在此上下文中)是指向char的指针,因此您尝试将地址存储在char中。因此错误。

即使您执行decString=hexVal,也不会有效,原因有两个:它只会在函数中更改decStringhexVal是一个局部变量,所以它不是在函数之外有效。

而不是将此字符串从hexVal复制到decStringstrcpy(decString, hexVal);

答案 1 :(得分:1)

您不能按照您尝试的方式分配C字符串。相反,你想要:

strcpy(decString, hexVal);

答案 2 :(得分:0)

*decString = hexVal;存在问题。 decString是指向char的指针,因此*decString代表char。但是,hexValchar*(从技术上讲,它是&hexVal[0])。您正尝试将指针分配给字符。除非您使用的是8位平台,否则指针将无法放入字符内。此外,指针是指向局部变量的指针,这意味着一旦函数返回指针将无效。如果您要复制字符串,请改用strncpy()

为了澄清您的任务,您是否尝试将十进制数的字符串表示转换为十六进制字符串表示?如果是这样,如果将字符串转换为整数然后返回到字符串而不是尝试直接转换字符串,则可能会更成功。 sscanf()sprintf()的组合应该处理它。

答案 3 :(得分:0)

在这一行:

*decString = hexVal;

*decStringchar,因此您要指定一个指向char的指针,因此警告。

您无法在C中分配字符串;一般来说,你必须复制它们。

但是,您还需要指定要转换的值,并确保为格式化的值提供足够的空间。目前,您正在使用decStr的第一个字符并将其转换为十六进制,这有点不寻常作为接口(实际上可能是错误的)。

你通常会这样做:

void decToHex(int value, char *hexString)
{
    sprintf(hexString,"%x", value);
}

注意更改的界面。这不允许函数检查它是否有足够的空间;遗憾的是,将责任放在调用代码上是一个长期(但很麻烦)的C传统。更安全的方法是使用C99中的snprintf()

int decToHex(int value, char *buffer, size_t buflen)
{
    return snprintf(buffer, buflen, "%x", value);
}

这告诉你字符串有多长,或者如果没有空间容纳所有数据,缓冲区应该有多长时间(除非在Windows上,当转换后的字符串太长时它返回-1)。字符串应该以空值终止(注意MSVC),并且永远不应溢出bufferbuflen指定的缓冲区。原则上,将buffer设置为NULL应该可以让您找出所需的缓冲区大小(再次注意MSVC)。

你通常会这样称呼它:

char buffer[20];

if (decToHex(314159265, buffer, sizeof(buffer)) >= sizeof(buffer))
    ...oops - conversion failed...

或者,更懒惰:

 char buffer[32];  // Bigger margin for error

 decToHex(314159265, buffer, sizeof(buffer));