c - 无符号字符和 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 或其他东西。有谁知道我怎么能做到这一点?
谢谢。
解决方案
我不认为你可以sprintf()
用来存储255
到缓冲区中。缓冲区参数sprintf()
是一个char
数组。是否或默认情况下是实现定义的char
;请参阅默认情况下是 char 有符号还是无符号?. 如果 大于,尝试存储会导致未定义的行为;如果实现默认为then可能是.signed
unsigned
255
CHAR_MAX
255
signed
CHAR_MAX
127
我建议不要使用sprintf()
将数字存储到缓冲区中。将其声明为:
unsigned char buffer[127];
然后你可以这样做:
buffer[0] = port;
buffer[1] = length;
snprintf((char *)(buffer + 2), sizeof buffer - 2, "%s", record);
推荐阅读
- java - 在 Catmull-Rom 样条曲线中使用相同坐标两次时的问题
- android - Viewpager 儿童海拔效果不会溢出
- javascript - javascript --- 每次用户按下按钮并取消前一个按钮时获取一个新数据
- postgresql - Postgres 连接未关闭-Hibernnate ererereq
- c# - 如何向 IGrouping 添加扩展方法?
- sql - 如何从 SparkR 中的数据框创建表
- c# - Entity Framework Core - 将 Azure SQL 实例设置为在弹性池中预配(不是 T-SQL)
- django - Django 模型选择字段:如何删除空字段?Django表单从选择列表中排除一个值?
- c# - 如何在 WPF DataGrid 中以编程方式设置属性和字段值?
- testing - 如何使用赛普拉斯从控制台触发点击?