| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1994 人关注过本帖
标题:小白求助大神
只看楼主 加入收藏
qjm100
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2018-7-23
结帖率:100%
收藏
已结贴  问题点数:5 回复次数:13 
小白求助大神
有谁知道printf 与scanf 函数的代码
搜索更多相关主题的帖子: printf scanf 函数 代码 
2018-08-15 15:47
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
收藏
得分:1 
printf函数称为格式输出函数,其关键字最末一个字母f即为“格式”(format)之意。其功能是按用户指定的格式,把指定的数据显示到显示器屏幕上。在前面的例题中我们已多次使用过这个函数。

printf函数调用的一般形式
printf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。但作为一个特例,不要求在使用 printf 函数之前必须包含stdio.h文件。printf函数调用的一般形式为:
    printf(“格式控制字符串”, 输出表列)
其中格式控制字符串用于指定输出格式。格式控制串可由格式字符串和非格式字符串两种组成。格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。如:

“%d”表示按十进制整型输出;
“%ld”表示按十进制长整型输出;
“%c”表示按字符型输出等。

非格式字符串原样输出,在显示中起提示作用。输出表列中给出了各个输出项,要求格式字符串和各输出项在数量和类型上应该一一对应。
函数名: scanf
功 能: 执行格式化输入
用 法: int scanf(char *format[,argument,...]);
scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。
其调用格式为:      scanf("<格式化字符串>",<地址表>);
scanf()函数返回成功赋值的数据项数,出错时则返回EOF。
其控制串由三类字符构成:
1。格式化说明符;
2。空白符;
3。非空白符;

(A)                格式化说明符

格式字符           说明
%a                 读入一个浮点值(仅C99有效)
%A                 同上
%c                 读入一个字符
%d                 读入十进制整数
%i                 读入十进制,八进制,十六进制整数
%o                 读入八进制整数
%x                 读入十六进制整数
%X                 同上
%c                 读入一个字符
%s                 读入一个字符串
%f                 读入一个浮点数
%F                 同上
%e                 同上
%E                 同上
%g                 同上
%G                 同上
%p                 读入一个指针
%u                 读入一个无符号十进制整数
%n                 至此已读入值的等价字符数
%[]                扫描字符集合
%%                 读%符号
               
附加格式说明字符表
修饰符                       说明
L/l 长度修饰符               输入"长"数据
h 长度修饰符                 输入"短"数据
W 整型常数                   指定输入数据所占宽度
* 星号                       空读一个数据
hh,ll同上h,l但仅对C99有效。

(B)         空白字符
空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符,空白符可以是space,tab,newline等等,直到第一个非空白符出现为止。
(C)        非空白字符
一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。
2018-08-15 15:56
qjm100
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2018-7-23
收藏
得分:0 
请问printf 的函数体是什么,,学到函数了,好奇
2018-08-15 16:00
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
收藏
得分:0 
printf函数称为格式输出函数
2018-08-15 16:06
qjm100
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2018-7-23
收藏
得分:0 
没有函数体吗
2018-08-15 16:12
will丶
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:117
专家分:443
注 册:2015-10-19
收藏
得分:0 
回复 5楼 qjm100
printf当然有函数体,它的函数原型是extern int printf(const char *format,...);,具体的函数体很复杂,而且已经被封装了成了.lib/.dll,想要看的话可以去找找开源的C库实现

腾空类星陨,遥望若花生。
2018-08-15 16:19
qjm100
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2018-7-23
收藏
得分:0 
嗯嗯

[此贴子已经被作者于2018-8-15 16:24编辑过]

2018-08-15 16:19
qjm100
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2018-7-23
收藏
得分:0 
回复 6楼 will丶
很复杂吗,I am a child

[此贴子已经被作者于2018-8-15 16:29编辑过]

2018-08-15 16:22
will丶
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:117
专家分:443
注 册:2015-10-19
收藏
得分:4 
回复 8楼 qjm100
刚刚在网上找到个
程序代码:
int printf(const char *format,...)

{

  int n;

  va_list arg_ptr;

  va_start(arg_ptr, format);

  n=vprintf(format, arg_ptr);

  va_end(arg_ptr);

  return n;

}



int vprintf(const char *format, va_list ap)

{

  struct arg_printf _ap = { 0, (int(*)(void*,size_t,void*)) __stdio_outs };

  return __v_printf(&_ap,format,ap);

}



int __v_printf(struct arg_printf* fn, const char *format, va_list arg_ptr)

{

  unsigned int len=0;

#ifdef WANT_ERROR_PRINTF

  int _errno = errno;

#endif



  while (*format) {

    unsigned long sz = skip_to(format);

    if (sz) {

      B_WRITE(fn,format,sz); len+=sz;

      format+=sz;

    }

    if (*format=='%') {

      char buf[128];

      union { char*s; } u_str;

#define s u_str.s



      int retval;

      unsigned char ch, padwith=' ', precpadwith=' ';



      char flag_in_sign=0;

      char flag_upcase=0;

      char flag_hash=0;

      char flag_left=0;

      char flag_space=0;

      char flag_sign=0;

      char flag_dot=0;

      signed char flag_long=0;



      unsigned int base;

      unsigned int width=0, preci=0;



      long number=0;

#ifdef WANT_LONGLONG_PRINTF

      long long llnumber=0;

#endif



      ++format;

inn_printf:

      switch(ch=*format++) {

      case 0:

    return -1;

    break;



      /* FLAGS */

      case '#':

    flag_hash=-1;

      case 'z':

    goto inn_printf;



      case 'h':

    --flag_long;

    goto inn_printf;

#if __WORDSIZE != 64

      case 'j':

#endif

      case 'q':        /* BSD ... */

      case 'L':

    ++flag_long; /* fall through */

#if __WORDSIZE == 64

      case 'j':

#endif

      case 'l':

    ++flag_long;

    goto inn_printf;



      case '-':

    flag_left=1;

    goto inn_printf;



      case ' ':

    flag_space=1;

    goto inn_printf;



      case '+':

    flag_sign=1;

    goto inn_printf;



      case '0':

      case '1':

      case '2':

      case '3':

      case '4':

      case '5':

      case '6':

      case '7':

      case '8':

      case '9':

    if(flag_dot) return -1;

    width=strtoul(format-1,(char**)&s,10);

    if (width>MAX_WIDTH) return -1;

    if (ch=='0' && !flag_left) padwith='0';

    format=s;

    goto inn_printf;



      case '*':

    width=va_arg(arg_ptr,int);

    if (width>MAX_WIDTH) return -1; /* width is unsiged, so this catches <0, too */

    goto inn_printf;



      case '.':

    flag_dot=1;

    if (*format=='*') {

      int tmp=va_arg(arg_ptr,int);

      preci=tmp<0?0:tmp;

      ++format;

    } else {

      long int tmp=strtol(format,(char**)&s,10);

      preci=tmp<0?0:tmp;

      format=s;

    }

    if (preci>MAX_WIDTH) return -1;

    goto inn_printf;



      /* print a char or % */

      case 'c':

    ch=(char)va_arg(arg_ptr,int);

      case '%':

    B_WRITE(fn,&ch,1); ++len;

    break;



#ifdef WANT_ERROR_PRINTF

      /* print an error message */

      case 'm':

    s=strerror(_errno);

    sz=strlen(s);

    B_WRITE(fn,s,sz); len+=sz;

    break;

#endif

      /* print a string */

      case 's':

    s=va_arg(arg_ptr,char *);

#ifdef WANT_NULL_PRINTF

    if (!s) s="(null)";

#endif

    sz = strlen(s);

    if (flag_dot && sz>preci) sz=preci;

    preci=0;

    flag_dot^=flag_dot;

    padwith=precpadwith=' ';



print_out:

      {

    char *sign=s;

    int todo=0;

    int vs;

    

    if (! (width||preci) ) {

      B_WRITE(fn,s,sz); len+=sz;

      break;

    }

    

    if (flag_in_sign) todo=1;

    if (flag_hash>0)  todo=flag_hash;

    if (todo) {

      s+=todo;

      sz-=todo;

      width-=todo;

    }



    /* These are the cases for 1234 or "1234" respectively:

          %.6u -> "001234"

          %6u  -> "  1234"

          %06u -> "001234"

          %-6u -> "1234  "

          %.6s -> "1234"

          %6s  -> "  1234"

          %06s -> "  1234"

          %-6s -> "1234  "

          %6.5u -> " 01234"

          %6.5s -> "  1234"

           In this code, for %6.5s, 6 is width, 5 is preci.

       flag_dot means there was a '.' and preci is set.

       flag_left means there was a '-'.

       sz is 4 (strlen("1234")).

       padwith will be '0' for %06u, ' ' otherwise.

       precpadwith is '0' for %u, ' ' for %s.

     */



    if (flag_dot && width==0) width=preci;

    if (!flag_dot) preci=sz;

    if (!flag_left) { /* do left-side padding */

      if (write_pad(&len,fn,width-preci,padwith))

        return -1;

    }

    if (todo) {

      B_WRITE(fn,sign,todo);

      len+=todo;

    }

    /* do preci padding */

    if (write_pad(&len,fn,preci-sz,precpadwith))

      return -1;

    /* write actual string */

    B_WRITE(fn,s,sz); len+=sz;

    if (flag_left) {

      if (write_pad(&len,fn,width-preci,padwith))

        return -1;

    }

    

    break;

      }



      /* print an integer value */

      case 'b':

    base=2;

    sz=0;

    goto num_printf;

      case 'p':

    flag_hash=2;

    flag_long=1;

    ch='x';

      case 'X':

    flag_upcase=(ch=='X');

      case 'x':

    base=16;

    sz=0;

    if (flag_hash) {

      buf[1]='0';

      buf[2]=ch;

      flag_hash=2;

      sz=2;

    }

    if (preci>width) width=preci;

    goto num_printf;

      case 'd':

      case 'i':

    flag_in_sign=1;

      case 'u':

    base=10;

    sz=0;

    goto num_printf;

      case 'o':

    base=8;

    sz=0;

    if (flag_hash) {

      buf[1]='0';

      flag_hash=1;

      ++sz;

    }



num_printf:

    s=buf+1;



    if (flag_long>0) {

#ifdef WANT_LONGLONG_PRINTF

      if (flag_long>1)

        llnumber=va_arg(arg_ptr,long long);

      else

#endif

        number=va_arg(arg_ptr,long);

    }

    else {

      number=va_arg(arg_ptr,int);

      if (sizeof(int) != sizeof(long) && !flag_in_sign)

        number&=((unsigned int)-1);

    }



    if (flag_in_sign) {

#ifdef WANT_LONGLONG_PRINTF

      if ((flag_long>1)&&(llnumber<0)) {

        llnumber=-llnumber;

        flag_in_sign=2;

      } else

#endif

        if (number<0) {

          number=-number;

          flag_in_sign=2;

        }

    }

    if (flag_long<0) number&=0xffff;

    if (flag_long<-1) number&=0xff;

#ifdef WANT_LONGLONG_PRINTF

    if (flag_long>1)

      retval = __lltostr(s+sz,sizeof(buf)-5,(unsigned long long) llnumber,base,flag_upcase);

    else

#endif

      retval = __ltostr(s+sz,sizeof(buf)-5,(unsigned long) number,base,flag_upcase);



    /* When 0 is printed with an explicit precision 0, the output is empty. */

    if (flag_dot && retval == 1 && s[sz] == '0') {

      if (preci == 0||flag_hash > 0) {

        sz = 0;

      }

      flag_hash = 0;

    } else sz += retval;



    if (flag_in_sign==2) {

      *(--s)='-';

      ++sz;

    } else if ((flag_in_sign)&&(flag_sign || flag_space)) {

      *(--s)=(flag_sign)?'+':' ';

      ++sz;

    } else flag_in_sign=0;



    precpadwith='0';



    goto print_out;



#ifdef WANT_FLOATING_POINT_IN_PRINTF

      /* print a floating point value */

      case 'f':

      case 'g':

    {

      int g=(ch=='g');

      double d=va_arg(arg_ptr,double);

      s=buf+1;

      if (width==0) width=1;

      if (!flag_dot) preci=6;

      if (flag_sign || d < +0.0) flag_in_sign=1;



      sz=__dtostr(d,s,sizeof(buf)-1,width,preci,g);



      if (flag_dot) {

        char *tmp;

        if ((tmp=strchr(s,'.'))) {

          if (preci || flag_hash) ++tmp;

          while (preci>0 && *++tmp) --preci;

          *tmp=0;

        } else if (flag_hash) {

          s[sz]='.';

          s[++sz]='\0';

        }

      }



      if (g) {

        char *tmp,*tmp1;    /* boy, is _this_ ugly! */

        if ((tmp=strchr(s,'.'))) {

          tmp1=strchr(tmp,'e');

          while (*tmp) ++tmp;

          if (tmp1) tmp=tmp1;

          while (*--tmp=='0') ;

          if (*tmp!='.') ++tmp;

          *tmp=0;

          if (tmp1) strcpy(tmp,tmp1);

        }

      }

      

      if ((flag_sign || flag_space) && d>=0) {

        *(--s)=(flag_sign)?'+':' ';

        ++sz;

      }

      

      sz=strlen(s);

      if (width<sz) width=sz;

      padwith='0';

      flag_dot=0;

      flag_hash=0;

      goto print_out;

    }

#endif



      default:

    break;

      }

    }

  }

  return len;

}

腾空类星陨,遥望若花生。
2018-08-15 16:30
qjm100
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2018-7-23
收藏
得分:0 
谢谢,哥哥真棒
2018-08-15 16:33
快速回复:小白求助大神
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030220 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved