首页 > 解决方案 > 无符号字符和 sprintf() C

问题描述

我有这个代码:

int main(){

char buffer[1024];
char port = 1;
int length = 255;
char * record = "$TAG ,0 ,89 ,0, 1\n";

if(length < 0 || length > 255){
    printf("Error - length out of range for an unsigned char.\n");
    exit(1);
}

snprintf(buffer, 1024, "%c%c%s", port, (unsigned char) length, record);

int port_rc     = buffer[0];
int length_rc   = buffer[1]; 

printf("port_rc: %d\n",port_rc);
printf("length_rc: %d\n",length_rc);

return 0;

}

运行时输出:

port_rc: 1 length_rc: -1

我认为我在 snprintf() 方面遗漏了一些东西,因为在读取它创建的数组时我没有看到 255 值。我的猜测是 snprintf() 正在将变量“长度”提升为 int 或其他东西。有谁知道我怎么能做到这一点?

谢谢。

标签: cprintf

解决方案


我不认为你可以sprintf()用来存储255到缓冲区中。缓冲区参数sprintf()是一个char数组。是否或默认情况下是实现定义的char;请参阅默认情况下是 char 有符号还是无符号?. 如果 大于,尝试存储会导致未定义的行为;如果实现默认为then可能是.signedunsigned255CHAR_MAX255signedCHAR_MAX127

我建议不要使用sprintf()将数字存储到缓冲区中。将其声明为:

unsigned char buffer[127];

然后你可以这样做:

buffer[0] = port;
buffer[1] = length;
snprintf((char *)(buffer + 2), sizeof buffer - 2, "%s", record);

推荐阅读