Memcpy int to char buffer - 作为sprintf的替代品

时间:2010-09-16 09:38:30

标签: c++ unix

#include <iostream>

using namespace std;

int main()
{
     char buffer[8];
     int field=534;
     memcpy(buffer,&field,sizeof(field));
     cout<<buffer<<endl;

     return 0;
}

这将返回一个空缓冲区。为什么呢?

基本上寻找sprintf的替代方法,将int转换为char缓冲区。

Itoa不在。

思考?更好的选择?

5 个答案:

答案 0 :(得分:4)

您必须使用sprintf或itoa将二进制int转换为ascii字符串。

如果ints和char数组是完全不同的,那么表示可以包含值为零的字节,但字符串只能将其作为最后一个字节。

例如

取0 - 在int中它由4个字节表示,值为0而while)因为字符串具有48和0的前两个字节所以没有简单的强制转换将为此设置

答案 1 :(得分:3)

我认为memcpy已成功。 Memcopy将复制字节而不是将字节转换为字符(如您所愿)。您无法看到因为534碰巧产生两个不可打印的字符。尝试使用18505,它会打印一条消息。不是你想要的。

如果itoa不可用,那么你总是可以自己编写。事实上,这是一个常见的计算机科学作业问题。要做到这一点,你需要从整数中分离每个数字(提示整数除法将截断 - 正是我们想要的!)并且你需要将每个数字从0到9之间的整数转换成它的ascii表示。

这有足够的提示,但如果您需要更多帮助,请随时提问。

答案 2 :(得分:2)

如果itoa可用,你可以使用它,这个函数不是C ++的一部分,但有些编译器支持。

或者你可以这样做:

std::stringstream out;
out << field;
strcpy(buffer,out.str().c_str());

答案 3 :(得分:2)

你也可以使用istringstream:

istringstream ss(field);
ss>>buffer;

答案 4 :(得分:1)

由于char的编码和事实'9',你的方法不会起作用!= 9.但为什么不建立你自己的itoa?它非常简单(提示:x - '0'将'0' - '9'变为0 - 9),或者只是从任何一个开源libstdc中复制itoa变量的源