2011-07-19 91 views
1

我想知道将整数转换为char/string的方法,反之亦然。如何在Linux(gcc)中将int转换为字符/字符串,反之亦然?

我已经使用的sprintf(& charvar, “%d”,& intvar),但它会产生错误的输出,有可能的垃圾。

我还听说的atoi()在GCC有bugs.Reference:GCC atoi bug

什么其他的方法来串/字符转换回为int?

其实我想发送一个整数从一台机器到另一个使用SOCK_STREAM。

//编辑:我忘了告诉sprintf()做转换并返回正值。

+1

我不会称之为“bug”,它只是int类型的限制。如果您需要避免溢出,请在使用'atoi'之前验证输入长度。 –

回答

1

如果你想为一个整数发送到另一台机器,你可以把它作为二进制数据,仅仅通过直接发送intvar到流,你不必须先将其转换为字符。这只会在知道数据长度时引入问题,因为不同的值会生成不同长度的字符串。

+0

你的意思是发送(socket_file_desc,intvar,sizeof(int),0)? –

+1

是的,差不多:'send(socket_file_desc,&intvar,sizeof(int),0)'。 'send'取得要发送的数据的地址,而不是直接的值。 –

+0

以及如何接收它呢?我正在使用FILE * fp = fdopen(socket_file_desc,“r”); char c; C =龟etc(FP);在客户端 –

1

intvar之前取出符号:

sprintf(&charvar,"%d",intvar) 

有两点需要注意:

  • 在这里,我假设&charvar是正确的类型,它有可能不是。
  • 虽然这里可能没有太大的区别,但养成使用snprintf而不是sprintf的习惯是很好的做法。

下面是一些示例代码:

int intvar = ...; 
char str[16]; 
snprintf(str, sizeof(str), "%d", intvar); 
+0

仍然没有区别,我输入2并得到[作为输出,删除&符号不能解决问题 –

1

请阅读'sprintf'和'sscanf'手册,也许他们的安全版本适合您。

0

您不能将sprintf设置为变量。你需要一个缓冲区,因为可能有几个数字和尾随零。而且,参数应该是int变量,而不是地址。

实施例:

char buffer[256]; 
int i = 42; 
sprintf(buffer, "%d", i); 

(缓冲器被填充有 '4', '2' 和尾随 '\ 0')。

0

你的sprintf写错了。你应该写sprintf(字符串,“%d”,integer); 如果你想通过网络发送一个整数,这就是为什么你想将其转换成字符串看看htons

具有这些功能,你可以转换一个整数的网络制式,并避免不同字节顺序的问题!如果你希望你的字符串有整型值,那么你应该用sprintf

char buf[4]; 
memcpy(buf,&integer,4); 

: 如果你只是想将其转换为字节你可以做这样的事情。

相关问题