从char和int创建char*

从char和int创建char*,c,char,C,Char,我可以把一个char和int组合成一个char*吗 始终只有一个字符和一个4位整数 例如: 我有字符A和整数1234。 如何将它们组合成指向具有A1234的字符数组的字符* CID[0] = character CID[1] = ID & 0xff; CID[2] = (ID >> 8) & 0xff; CID[3] = (ID >> 16) & 0xff; CID[4] = (ID >> 24) & 0xff; 假设字符是

我可以把一个char和int组合成一个char*吗

始终只有一个字符和一个4位整数

例如: 我有字符A和整数1234。 如何将它们组合成指向具有A1234的字符数组的字符*

CID[0] = character 
CID[1] = ID & 0xff;
CID[2] = (ID >> 8) & 0xff;
CID[3] = (ID >> 16) & 0xff;
CID[4] = (ID >> 24) & 0xff;
假设字符是一个以a为值的正确字符,ID是一个以1234为值的正确整数

使用sprintf/snprintf函数

sprintf的示例:


基本字符串格式:

char buf[32];
snprintf(buf, sizeof(buf), "%c%d", 'A', 1234);
当c和d是char和int时


不过,要小心缓冲区溢出。H2CO3的答案显示了一个更安全的选择。

要复制您在问题中所写的内容并避开snprintf问题:

如果您的编译器足够聪明,并且您的处理器具有良好的除法器单元,那么它肯定会比调用sprintf更快

编辑:关于编译器的智能性和良好性的一点澄清。编译器通常能够使用移位、加法、减法和避免so除法指令将常量乘法和除法转换为替代代码,即使在最快的处理器中,这也需要一些时间。
这里显示的显式转换也将在sprintf中以更通用的方式进行。

请不要使用sprintf!有一天它会导致缓冲区溢出。你是说有一天int将是128位?当缓冲区大小变为不足时。这也是为什么mallocsizeof*p比mallocsizeof类型更受欢迎的原因。从现在起,我将否决所有滥用sprintf的答案。我从这个开始,我把答案投了更高的票。在这种情况下,sprintf就足够了。当适当的大小>20时,该函数不会溢出,sprintf仍然比snprintf更具可移植性。此外,没有溢出检查的snprintf也不好,因为它只掩盖了一个错误,仍然在关注这个问题,@H2CO3,:?@tristopia的大小是否合适-是的,确实如此。我们是人类,我们会犯错误,我们的缓冲区太小了。最好是安全的,而不是冒着堆栈损坏的风险,对吗?敲出sizeofbuf不应该伤到你的手指。@DimaRudnik啊,是的,刚刚回答了那个评论。别误会我的意思——否决票并不反对你。再次感谢你的回答。好像我总是看到你回答我的问题。类似的,如果我想创建一个123.345字符呢?在2整数中使用a。在中间我尝试了%d%c%d,但不起作用。@user1043625您希望从哪种数据中获取该字符串?另外,请用谷歌搜索这些,如果我经常回答这样的问题,很可能你没有阅读足够的标准库文档。基本上,我把2个整数和一个整数结合起来。把他们分开。我正在查看snprintf文档,我希望%d%c%d可以工作。但不是给出123.345,而是得到12345。Nvm,让它与%d.%d一起工作。Thanks@user1043625%d.%d,123,345和%d%c%d,123,'.',345都应该工作。你在用其中一个吗?@user1043625顺便说一下,谢谢你的接受。+1因为这很聪明,但我必须承认它非常难看。
char buf[32];
snprintf(buf, sizeof(buf), "%c%d", 'A', 1234);
#include <stdio.h>

buf [SIZE];
sprintf(buf, "%c%d", c, d);
CID[0] = character 
CID[1] = ID / 1000;
CID[2] = (ID / 100) % 10;
CID[3] = (ID / 10) % 100;
CID[4] = ID % 10;