求教关于数值与字符串转换

see22 2007-01-30 11:23:44
比如一个int数值,转换为char *,我们可以这样:
sprintf(str, "%d", i);

可是如果数值是pid_t, size_t等等,却又如何用通用的方法转换,
通过查询我现在使用的操作系统(for x86)头文件,可以得知pid_t == int, size_t == unsigned int
那么也可以这么转换
sprintf(str, "%d", pid);
sprintf(str, "%u", size);

可是这种死代码不具有移植性,如果机器换成16位或者64位,代码可能就会出错,

现在请问各位老大,如何写出具有移植性的代码,通常这种情况你们是如何处理的?

顺便提一下, 我看到一些软件在configure时,会测试数值的长度,但是只是看到表面,
具体如何处理还不知道,可否告知,但是感觉这种方法比较麻烦,有没有比较简单通用的方法?
...全文
389 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jixingzhong 2007-01-30
  • 打赏
  • 举报
回复
利用 宏 define 增强移植性,
但是还是在少数情况下会出现问题 ~
taodm 2007-01-30
  • 打赏
  • 举报
回复
用C++
goodluckyxl 2007-01-30
  • 打赏
  • 举报
回复
移植对size_t pid的类型重新定义
或者自己定义定义一套数据类型
简单可以参考ucosII中类型定义
晨星 2007-01-30
  • 打赏
  • 举报
回复
条件编译也是一个办法,让一些对平台比较敏感的代码在每一种你想支持的平台上都有确定的行为,同时对使用代码人也是一种提示:即你必须提供相关的宏来给出平台相关信息,否则程序没法工作。

比如:

#if defined(WIN32)
...
#elif definded(LINUX_IA64)
...
#elif
...
#else
error "Un-supported platform."
#endif

C++中通过使用模板,重载等机制应该还有别的方法。
晨星 2007-01-30
  • 打赏
  • 举报
回复
只能自己封装一下了,除此没有完美的解决方案。
C不支持重载,也就没有自动的根据参数的实际类型去选择一个正确函数执行的能力。
色郎中 2007-01-30
  • 打赏
  • 举报
回复
宏定义啊

todototry 2007-01-30
  • 打赏
  • 举报
回复
mark
doubhor 2007-01-30
  • 打赏
  • 举报
回复

#include <STDIO.H>
#include <STDLIB.H>
#include <MEMORY.H>


typedef enum data_type_T
{
DATA_TYPE_int = 1,
DATA_TYPE_ushort = 2,
DATA_TYPE_float = 3
}data_type;

typedef struct data_str_T
{
data_type m_type;
union
{
int m_data_int;
unsigned short m_data_ushort;
float m_data_float;
}m_data;
}data_str;

void int2str(char *pStr, data_str outData)
{
if (pStr == NULL)
{
return;
}

switch (outData.m_type)
{
case DATA_TYPE_int:
sprintf(pStr, "%d", outData.m_data.m_data_int);
break;
case DATA_TYPE_ushort:
sprintf(pStr, "%u", outData.m_data.m_data_ushort);
break;
case DATA_TYPE_float:
sprintf(pStr, "%f", outData.m_data.m_data_float);
break;
default:
pStr[0] = '\0';
break;
}
}

int main(void)
{
data_str test_data;
char strOut[200];
int test_int = 78;
unsigned short test_ushort = 67;
float test_float = 3.456f;

test_data.m_type = DATA_TYPE_int;
test_data.m_data.m_data_int = test_int;
int2str(strOut, test_data);
printf("\nNum: %d, String: %s", test_int, strOut);

test_data.m_type = DATA_TYPE_ushort;
test_data.m_data.m_data_ushort = test_ushort;
int2str(strOut, test_data);
printf("\nNum: %u, String: %s", test_ushort, strOut);

test_data.m_type = DATA_TYPE_float;
test_data.m_data.m_data_float = test_float;
int2str(strOut, test_data);
printf("\nNum: %f, String: %s", test_float, strOut);

return 0;
}

see22 2007-01-30
  • 打赏
  • 举报
回复
谢谢各位大哥,有谁能具体举个例子来如何做 up
softwarewander 2007-01-30
  • 打赏
  • 举报
回复
个人觉得

C不支持重载,也就没有自动的根据参数的实际类型去选择一个正确函数执行的能力。

但是似乎这些可以通过巧妙强制转化,和宏定义来实现。不知道c++中的重载和多态是怎么实现的


softwarewander 2007-01-30
  • 打赏
  • 举报
回复
宏定义可以试一试

大概的我觉得。。 include/linux/list.h当中的 list_entry的定义好像可以

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧