0

我在编写将十进制转换为十六进制的代码时遇到问题。

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

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

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

4

4 回答 4

2

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

即使你会这样做decString=hexVal,它也不会起作用,原因有两个:它decString只会在函数中改变,并且hexVal是一个局部变量,所以它在函数之外是无效的。

取而代之的是,将字符串从复制hexValdecString: strcpy(decString, hexVal);

于 2012-04-09T23:43:23.760 回答
1

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

strcpy(decString, hexVal);
于 2012-04-09T23:38:23.280 回答
0

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

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

于 2012-04-09T23:43:58.707 回答
0

在这条线上:

*decString = hexVal;

*decString是 a char,因此您正在分配一个指向 a 的指针char,因此是警告。

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

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

你通常会这样做:

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

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

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

这告诉您字符串有多长,或者如果没有空间容纳所有数据,缓冲区应该有多长(Windows 除外,当转换的字符串太长时它返回 -1)。字符串应该以 null 结尾(注意 MSVC),并且永远不应该溢出由bufferand指定的缓冲区buflen。原则上,设置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));
于 2012-04-10T00:02:58.827 回答