关于sprintf()函数的疑问

yel617 2011-03-08 09:58:42
#include <stdio.h>

int main(void)
{
int nPort = 80;
char src[4];
char dst[4];

sprintf(src, "%d", nPort);
printf("src = %s\n", src);
sprintf(dst, "%s", &nPort);
printf("dst = %s\n", dst);

return 0;
}

运行结果:
[root@localhost funtion]# gcc -o sprintf sprintf.c
[root@localhost funtion]# ./sprintf
src = 80
dst = P

sprintf(src, "%d", nPort)
sprintf(dst, "%s", &nPort)
这里为什么一个用nPort,一个要用&nPort?
第二个用nPort的时候总是出现段错误
...全文
206 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yel617 2011-03-10
  • 打赏
  • 举报
回复
谢谢各位的答复
明白了
Dawncui 2011-03-08
  • 打赏
  • 举报
回复
指针的字面值是一个整形数 应该用%d格式化的,不是%s。
LinuxBirdMan 2011-03-08
  • 打赏
  • 举报
回复
。。我的回复是错的。。。4L是对的
Ulfsaar 2011-03-08
  • 打赏
  • 举报
回复
sprintf(dst, "%s", &nPort)
不知道你要干什么!

julysee 2011-03-08
  • 打赏
  • 举报
回复
格式符问题。
victor 2011-03-08
  • 打赏
  • 举报
回复
你的代码飞了
赵4老师 2011-03-08
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
delphiwcdj 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 justkk 的回复:]

sprintf(dst, "%s", nPort)
表示访问0x80那个地址,这么小的地址通常不是应用程序能访问的,所以段错误
[/Quote]
++
lx3275852 2011-03-08
  • 打赏
  • 举报
回复
%d 要求的参数类型是 int型
%s 要求的参数类型是 void*(你可以理解成char*),也就说是个地址。。
所以%s 参数需要加&
但是,你这个程序逻辑上是有问题的,因为nPort是一个整数,得出来的结果是ASCII码=80的字符与'\0'组成的字符串。。。。

第二个用nPort的时候总是出现段错误:
逻辑有错误,当用80的时候,没啥问题,你要是给nPort赋值为一个负数的话,就会出现乱码或者段错误
justkk 2011-03-08
  • 打赏
  • 举报
回复
sprintf(dst, "%s", nPort)
表示访问0x80那个地址,这么小的地址通常不是应用程序能访问的,所以段错误
justkk 2011-03-08
  • 打赏
  • 举报
回复
%d 对应一个整数参数
%s 对应一个字符串参数,也就是一个地址
LinuxBirdMan 2011-03-08
  • 打赏
  • 举报
回复
//dst数组长度才4,一个地址的长度比4长,数组出现越界
LinuxBirdMan 2011-03-08
  • 打赏
  • 举报
回复
数组长度不够

69,382

社区成员

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

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