printf question

arden1019 2006-07-28 06:03:23
#include <stdio.h>

int main ()
{
int i=10;
printf("%d--%d",i);
system("pause");
return;
}

这个程序后面的一个%d将打印什么内容?老烦给解释一下谢谢
...全文
211 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
bombwang 2006-07-28
  • 打赏
  • 举报
回复
慢慢看
arden1019 2006-07-28
  • 打赏
  • 举报
回复
static int printi(char **out, int i, int b, int sg, int width, int pad, int letbase)
{
char print_buf[PRINT_BUF_LEN];
register char *s;
register int t, neg = 0, pc = 0;
register unsigned int u = i;

if (i == 0) {
print_buf[0] = '0';
print_buf[1] = '\0';
return prints (out, print_buf, width, pad);
}

if (sg && b == 10 && i < 0) {
neg = 1;
u = -i;
}

s = print_buf + PRINT_BUF_LEN-1;
*s = '\0';

while (u) {
t = u % b;
if( t >= 10 )
t += letbase - '0' - 10;
*--s = t + '0';
u /= b;
}

if (neg) {
if( width && (pad & PAD_ZERO) ) {
printchar (out, '-');
++pc;
--width;
}
else {
*--s = '-';
}
}

return pc + prints (out, s, width, pad);
}
arden1019 2006-07-28
  • 打赏
  • 举报
回复
从网上找到的一个c的printf实现:

/* assuming sizeof(void *) == sizeof(int) */

int printf(const char *format, ...)
{
register int *varg = (int *)(&format);
return print(0, varg);
}

static int print(char **out, int *varg)
{
register int width, pad;
register int pc = 0;
register char *format = (char *)(*varg++);
char scr[2];

for (; *format != 0; ++format) {
if (*format == '%') {
++format;
width = pad = 0;
if (*format == '\0') break;
if (*format == '%') goto out;
if (*format == '-') {
++format;
pad = PAD_RIGHT;
}
while (*format == '0') {
++format;
pad |= PAD_ZERO;
}
for ( ; *format >= '0' && *format <= '9'; ++format) {
width *= 10;
width += *format - '0';
}
if( *format == 's' ) {
register char *s = *((char **)varg++);
pc += prints (out, s?s:"(null)", width, pad);
continue;
}
if( *format == 'd' ) {
pc += printi (out, *varg++, 10, 1, width, pad, 'a');
continue;
}
if( *format == 'x' ) {
pc += printi (out, *varg++, 16, 0, width, pad, 'a');
continue;
}
if( *format == 'X' ) {
pc += printi (out, *varg++, 16, 0, width, pad, 'A');
continue;
}
if( *format == 'u' ) {
pc += printi (out, *varg++, 10, 0, width, pad, 'a');
continue;
}
if( *format == 'c' ) {
/* char are converted to int then pushed on the stack */
scr[0] = *varg++;
scr[1] = '\0';
pc += prints (out, scr, width, pad);
continue;
}
}
else {
out:
printchar (out, *format);
++pc;
}
}
if (out) **out = '\0';
return pc;
}
arden1019 2006-07-28
  • 打赏
  • 举报
回复
多谢上面两位老大
jixingzhong 2006-07-28
  • 打赏
  • 举报
回复
这个也可以说是溢出,
楼主可以看看 printf 的实现,

根据格式控制符号,
这个语句命令将去栈中取第二个参数,
但是实际上这个参数是不存在,
这个空间不是函数 printf 所拥有的空间,
所以说是溢出 。
madiankun 2006-07-28
  • 打赏
  • 举报
回复
int main ()
{
int k=i=10;
printf("%d--%d",i,k);/*此处有问题,应该再加上一个整形数字 才对呢*/
system("pause");
return;
}
Dong 2006-07-28
  • 打赏
  • 举报
回复
printf(。。。)可以打印出来参数不定的值,但其实是这些值都是有地址的,都是可以找到的,不等参数在C里是有办法获取他们的参数类型和地址的。函数的参数是函数最里面开头定义的变量,是函数本身的变量。


printf("%d--%d",i);
-------------------------
按printf函数的定义方式,它会先获取%d的地址,然后再获取第二个%d的地址,但这个变量的地址是不存在的,他的指针是越界的野指针了,所溢出也是有道理的,但是是指针越界的
arden1019 2006-07-28
  • 打赏
  • 举报
回复
同事告诉我是溢出,想不通...

69,373

社区成员

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

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