【问题标题】:sprintf an unsigned char arraysprintf 一个无符号字符数组
【发布时间】:2018-04-09 09:09:10
【问题描述】:

我需要将 IP 地址读入一个 char 数组以便稍后处理。由于 IP 八位字节可以高达 256,因此我认为使用 unsigned char 数组来读取它们会很好。这就是我打算使用它的方式。

sprintf(buf,"%d.%d.%d.%d",ip24,ip16,ip8,ip);

但似乎 sprintf 的第一个参数应该是 char* ,因此它会抛出以下警告。我该如何处理。

expected ‘char * restrict’ but argument is of type ‘unsigned char *’

【问题讨论】:

  • 为什么不把buf初始化为一个char数组,大到可以处理一个ip地址呢?这样你就不需要它被取消签名:char buf[16]="255.255.255.255"
  • 无关紧要的是“IP 八位字节可以高达 256”。所以呢?您将它们呈现为由chars 组成的文本字符串。这个问题表明你对自己在做什么缺乏思考。
  • 您没有向我们展示,但buf 显然是错误的类型。将其声明为 char * 而不是 unsigned char*。根据ip 和朋友的类型,您可能希望使用%u 而不是%d(并且八位位组不能大到 256;有效范围是 [0,255])。

标签: c printf


【解决方案1】:

buf 的类型首先应该是 char*。 IP 八位字节可以达到 256(即它是无符号字符)这一事实与 bufunsigned char 的数组这一事实无关。

sprint 想要 char* 作为第一个参数,所以给它一个字符:

Live Demonstration

【讨论】:

    【解决方案2】:
    sprintf((char*)buf,"%d.%d.%d.%d",ip24,ip16,ip8,ip);
    

    这样可以避免警告。但是为什么不使用 char* buf 呢?

    【讨论】:

    • 这个答案具有误导性,他不应该使用unsigned char*,而是使用char*
    【解决方案3】:

    如果更改buf的数据类型很麻烦,您需要将buf声明为char*char buf[16]而不是unsigned char*,或者在使用时进行强制转换。

    正如你所说的,参考sprintf() 的手册页,它表明它需要char *str 类型的第一个参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-13
      • 2016-11-29
      • 1970-01-01
      相关资源
      最近更新 更多