繁体   English   中英

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

[英]Having trouble converting a character string to hexidecimal in C

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

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

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

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

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

即使您执行decString=hexVal ,它也不会工作,原因有两个:它只会在 function 中更改decString ,而hexVal是局部变量,因此它在 function 之外无效。

取而代之的是,将字符串从hexVal复制到decStringstrcpy(decString, hexVal); .

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

strcpy(decString, hexVal);

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

为了阐明您的任务,您是否尝试将十进制数的字符串表示形式转换为十六进制字符串表示形式 如果是这样,如果将字符串转换为 integer 然后再转换回字符串而不是尝试直接转换字符串,则可能会更成功。 sscanf()sprintf()的组合应该可以解决这个问题。

在这条线上:

*decString = hexVal;

*decString是一个char ,因此您要将指针分配给char ,因此会出现警告。

您不能在 C 中分配字符串; 通常,您必须复制它们。

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

你通常会这样做:

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

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

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

这告诉您字符串有多长,或者如果没有空间容纳所有数据,缓冲区应该有多长(Windows 除外,当转换后的字符串太长时它返回 -1)。 该字符串应该以 null 结尾(当心 MSVC)并且永远不会溢出 buffer 和buflen指定的buffer 原则上,将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));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM