【问题标题】:Having trouble converting a character string to hexidecimal in C在 C 中将字符串转换为十六进制时遇到问题
【发布时间】:2012-04-09 23:33:38
【问题描述】:

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

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

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

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

【问题讨论】:

  • 看这就是为什么我尝试不连续几个小时编码,我开始犯愚蠢的错误。感谢各位的帮助,不知道我想用 *decString = hexVal 完成什么。我确实有一个问题,为什么它是 strcpy(decString,hexVal) 而不是 strcpy(*decString,hexVal)?抱歉,您也可以看到指针方面还有一些新内容。
  • strcpy 需要获取地址来存储字符串的副本。第一个已经存储在那里的char 将无济于事......
  • strcpy() 需要一个指向源和目标的指针,因为它需要知道在内存中的何处查找和存储数据。取消引用指针只是为您提供值,当程序想要在内存中存储某些内容时,这没有帮助。
  • 完美,非常感谢大家。

标签: c pointers hex decimal


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    strcpy(decString, hexVal);
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 他不需要8位平台。他只需要CHAR_BIT-bit 平台。
      【解决方案4】:

      在这一行:

      *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)。字符串应该以 null 结尾(注意 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));
      

      【讨论】:

        猜你喜欢
        • 2013-09-05
        • 2011-08-02
        • 2018-01-31
        • 2022-07-22
        • 2016-03-06
        • 2015-05-22
        • 2020-11-07
        • 2014-06-09
        相关资源
        最近更新 更多