《匠人手记》推荐网上购书渠道:
互动出版网(china-pub)购书入口   >>>
当当网(dangdang)购书入口   >>>
卓越亚马逊网 购书入口   >>>
淘宝网(taobao)购书入口   >>>
更多购书渠道……   >>> 

设为首页加入收藏联系匠人管理入口21IC首页21IC博客21IC社区侃单片机回复的贴参与的贴

天气预报
百宝日历
载入中...

百宝专栏

载入中...
最新货色

载入中...

粉丝评论

载入中...

载入中...



百宝信息

载入中...

百宝流量

(2006-07-01开始)


匠人手记

 匠人观点: 好记性不如烂笔头  
 黑色幽默:三鹿门——后世畅想

学C51的基础6 《 输入输出函数及控制流程语句》
程序匠人 发表于 2005-10-1 17:19:00  阅读全文 | 回复(0) | 引用通告 | 编辑

学C51的基础6 《 输入输出函数及控制流程语句》 作者[cmh]
            --- 摘自《C51BBS离线版光盘》---

                                            输入输出函数及控制流程语句

    本节主要介绍Turbo C2.0标准输入输出函数和文件的输入输出函数。通过本节的学习可以使读者掌握Turbo C2.0的屏幕输出、
键盘输入输出以及磁盘文件的读写函数, 并能开始进行一些简单的程序的编写。
    控制流程语句主要包括: 条件语句、循环语句和开关语句。

    1.1  标准输入输出函数

    1.1.1 格式化输入输出函数
    Turbo C2.0 标准库提供了两个控制台格式化输入、 输出函数printf( ) 和scanf(), 这两个函数可以在标准输入输出设备上
以各种不同的格式读写数据。printf()函数用来向标准输出设备(屏幕)写数据;  scanf() 函数用来从标准输入设备(键盘)上读数
据。下面详细介绍这两个函数的用法。
    一、printf()函数
    printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。在编写程序时经常会用到此函数。printf()
函数的调用格式为:
      printf("<格式化字符串>", <参量表>);
    其中格式化字符串包括两部分内容: 一部分是正常字符,  这些字符将按原样输出; 另一部分是格式化规定字符, 以"%"开始,
后跟一个或几个规定字符, 用来确定输出内容格式。
    参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出参数个数一样多,各参数之间用","分开, 且顺序一
一对应,  否则将会出现意想不到的错误。
    1. 格式化规定符
    Turbo C2.0提供的格式化规定符如下:
━━━━━━━━━━━━━━━━━━━━━━━━━━
   符号                  作用
──────────────────────────
    %d              十进制有符号整数
    %u              十进制无符号整数
    %f              浮点数
    %s              字符串
    %c              单个字符
    %p              指针的值
    %e              指数形式的浮点数
    %x, %X          无符号以十六进制表示的整数
    %0              无符号以八进制表示的整数
    %g              自动选择合适的表示法
━━━━━━━━━━━━━━━━━━━━━━━━━━
    说明:
    (1). 可以在"%"和字母之间插进数字表示最大场宽。
     例如:  %3d   表示输出3位整型数, 不够3位右对齐。
            %9.2f 表示输出场宽为9的浮点数, 其中小数位为2, 整数位为6,小数点占一位, 不够9位右对齐。
            %8s   表示输出8个字符的字符串, 不够8个字符右对齐。

    如果字符串的长度、或整型数位数超过说明的场宽, 将按其实际长度输出。但对浮点数, 若整数部分位数超过了说明的整数位
宽度, 将按实际整数位输出; 若小数部分位数超过了说明的小数位宽度, 则按说明的宽度以四舍五入输出。
    另外, 若想在输出值前加一些0, 就应在场宽项前加个0。
    例如:   %04d  表示在输出一个小于4位的数值时, 将在前面补0使其总宽度为4位。
    如果用浮点数表示字符或整型量的输出格式, 小数点后的数字代表最大宽度, 小数点前的数字代表最小宽度。
    例如: %6.9s 表示显示一个长度不小于6且不大于9的字符串。若大于9, 则第9个字符以后的内容将被删除。
    (2). 可以在"%"和字母之间加小写字母l, 表示输出的是长型数。
    例如:   %ld   表示输出long整数
            %lf   表示输出double浮点数
    (3). 可以控制输出左对齐或右对齐, 即在"%"和字母之间加入一个"-" 号可说明输出为左对齐,否则为右对齐。
    例如:   %-7d  表示输出7位整数左对齐
            %-10s 表示输出10个字符左对齐
    2. 一些特殊规定字符
━━━━━━━━━━━━━━━━━━━━━━━━━━
    字符                           作用
──────────────────────────
     \n                   换行
     \f                   清屏并换页
     \r                   回车
     \t                   Tab符
     \xhh                 表示一个ASCII码用16进表示,
                          其中hh是1到2个16进制数
━━━━━━━━━━━━━━━━━━━━━━━━━━
    由本节所学的printf()函数, 并结合上一节学习的数据类型,编制下面的程序, 以加深对Turbo C2.0数据类型的了解。

    例1

     #i nclude<stdio.h>
     #i nclude<string.h>
     int main()
     {
          char c, s[20], *p;
          int a=1234, *i;
          float f=3.141592653589;
          double x=0.12345678987654321;
          p="How do you do";
          strcpy(s, "Hello, Comrade");
          *i=12;
          c='\x41';
          printf("a=%d\n", a);     /*结果输出十进制整数a=1234*/
          printf("a=%6d\n", a);    /*结果输出6位十进制数a=  1234*/
          printf("a=%06d\n", a);   /*结果输出6位十进制数a=001234*/
          printf("a=%2d\n", a);    /*a超过2位, 按实际值输出a=1234*/
          printf("*i=%4d\n", *i);  /*输出4位十进制整数*i=  12*/
          printf("*i=%-4d\n", *i); /*输出左对齐4位十进制整数*i=12*/
          printf("i=%p\n", i);     /*输出地址i=06E4*/
          printf("f=%f\n", f);     /*输出浮点数f=3.141593*/
          printf("f=6.4f\n", f);   /*输出6位其中小数点后4位的浮点数 f=3.1416*/
          printf("x=%lf\n", x);    /*输出长浮点数x=0.123457*/
          printf("x=%18.16lf\n", x);/*输出18位其中小数点后16位的长浮点数 x=0.1234567898765432*/
          printf("c=%c\n", c);     /*输出字符c=A*/
          printf("c=%x\n", c);     /*输出字符的ASCII码值c=41*/
          printf("s[]=%s\n", s);   /*输出数组字符串s[]=Hello, Comrade*/
          printf("s[]=%6.9s\n", s);/*输出最多9个字符的字符串s[]=Hello, Co*/
          printf("s=%p\n", s);     /*输出数组字符串首字符地址s=FFBE*/
          printf("*p=%s\n", p);    /* 输出指针字符串p=How do you do*/
          printf("p=%p\n", p);     /*输出指针的值p=0194*/
          getch();
          retunr 0;
     }

    上面结果中的地址值在不同计算机上可能不同。

    例1.中第一条语句#i nclude<stdio.h>的含义是调用另一个文件stdio.h, 这是一个头文件, 其中包括全部标准输入输出库函数
的数据类型定义和函数说明。 Turbo C2.0对每个库函数便用的变量及函数类型都已作了定义与说明, 放在相应头文件"*.h"中, 用
户用到这些函数时必须要用#i nclude<*.h>或#i nclude"*. h" 语句调用相应的头文件, 以供连接。若没有用此语句说明, 则连接时
将会出现错误。

二、scanf()函数
    scanf()函数是格式化输入函数, 它从标准输入设备(键盘) 读取输入的信息。 其调用格式为:
      scanf("<格式化字符串>", <地址表>);
    格式化字符串包括以下三类不同的字符;
    1. 格式化说明符: 格式化说明符与printf()函数中的格式说明符基本相同。
    2. 空白字符: 空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符。
    3. 非空白字符: 一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。地址表是需要读入的所有变
       量的地址, 而不是变量本身。这与printf()函数完全不同, 要特别注意。各个变量的地址之间同","分开。

    例2:

     main()
     {
          int i, j;
          printf("i, j=?\n");
          scanf("%d, %d", &i, &j);
     }

    上例中的scanf()函数先读一个整型数, 然后把接着输入的逗号剔除掉, 最后读入另一个整型数。如果","这一特定字符没有找
到, scanf()函数就终止。若参数之间的分隔符为空格, 则参数之间必须输入一个或多个空格。
    说明:
    (1). 对于字符串数组或字符串指针变量, 由于数组名和指针变量名本身就是地址, 因此使用scanf()函数时, 不需要在它们前
面加上"&"操作符。

    例3

     mian()
     {
          char *p, str[20];
          scanf("%s", p);          /*从健盘输入字符串*/
          scanf("%s", str);
          printf("%s\n", p);       /*向屏幕输出字符串*/
          printf("%s\n", str);
     }

    (2). 可以在格式化字符串中的"%"各格式化规定符之间加入一个整数, 表示任何读操作中的最大位数。如例3中若规定只能输入
10字符给字符串指针p, 则第一条scanf() 函数语句变为
          scanf("%10s", p);
    程序运行时一旦输入字符个数大于10, p就不再继续读入, 而后面的一个读入函数即scanf("%s", str)就会从第11个字符开始
读入。实际使用scanf()函数时存在一个问题, 下面举例进行说明:
    当使用多个scanf()函数连续给多个字符变量输入时, 例如:

     main()
     {
          char c1, c2;
          scanf("%c", &c1);
          scanf("%c", &c2);
          printf("c1 is %c, c2 is %c", c2\1, c2);
     }

    运行该程序, 输入一个字符A后回车 (要完成输入必须回车), 在执行scanf("%c", &c1)时, 给变量c1赋值"A", 但回车符仍然
留在缓冲区内, 执行输入语句scanf("%c", &c2)时, 变量c2输出的是一空行,如果输入AB后回车, 那么输出结果为:
       c1 is A, c2 is B。
    要解决以上问题, 可以在输入函数前加入清除函数fflush()( 这个函数的使用方法将在本节最后讲述)。修改以上程序变成:

     #i nclude<stdio.h>
     main()
     {
          char c1, c2;
          scanf("%c", &c1);
          fflush(stdin);
          scanf("%c", &c2);
          printf("c1 is %c, c2 is %c", c1, c2);
     }

    1.1.2 非格式化输入输出函数
    非格式化输入输出函数可以由上面讲述的标准格式化输入输出函数代替, 但这些函数编译后代码少, 相对占用内存也小, 从而
提高了速度, 同时使用也比较方便。下面分别进行介绍。
    一、puts()和gets()函数
    1. puts()函数
    puts()函数用来向标准输出设备(屏幕)写字符串并换行, 其调用格式为:
        puts(s);
    其中s为字符串变量(字符串数组名或字符串指针)。
    puts()函数的作用与语printf("%s\n", s)相同。

    例4:

     main()
     {
          char s[20], *f;                 /*定义字符串数组和指针变量*/
          strcpy(s, "Hello! Turbo C2.0"); /*字符串数组变量赋值*/
          f="Thank you";                  /*字符串指针变量赋值*/
          puts(s);
          puts(f);
     }

    说明:
    (1). puts()函数只能输出字符串, 不能输出数值或进行格式变换。
    (2). 可以将字符串直接写入puts()函数中。如:
          puts("Hello, Turbo C2.0");

    2. gets()函数
    gets()函数用来从标准输入设备(键盘)读取字符串直到回车结束, 但回车符不属于这个字符串。其调用格式为:
        gets(s);
    其中s为字符串变量(字符串数组名或字符串指针)。
    gets(s)函数与scanf("%s", &s)相似, 但不完全相同, 使用scanf("%s", &s)函数输入字符串时存在一个问题, 就是如果输入
了空格会认为输入字符串结束, 空格后的字符将作为下一个输入项处理, 但gets() 函数将接收输入的整个字符串直到回车为止。

    例5

     main()
     {
          char s[20], *f;
          printf("What's your name?\n");
          gets(s);                      /*等待输入字符串直到回车结束*/
          puts(s);                      /*将输入的字符串输出*/
          puts("How old are you?");
          gets(f);
          puts(f);
     }

    说明:
    (1). gets(s)函数中的变量s为一字符串。如果为单个字符, 编译连接不会有错误, 但运行后会出现"Null pointer asignmemt"
的错误。

    二、putchar()、getch()、getche()和getchar()函数
    1. putchar()函数
    putchar()函数是向标准输出设备输出一个字符, 其调用格式为:
       putchar(ch);

    其中ch为一个字符变量或常量。
    putchar()函数的作用等同于printf("%c", ch);

    例6:

     #i nclude<stdio.h>
     main()
     {
          char c:             /*定义字符变量*/
          c='B';              /*给字符变量赋值*/
          putchar(c);         /*输出该字符*/
          putchar('\x42');    /*输出字母B*/
          putchar(0x42);      /*直接用ASCII码值输出字母B*/
     }

    从本例中的连续四个字符输出函数语句可以分清字符变量的不同赋值方法。

    2. getch()、getche()和getchar()函数
    (1) getch()和getche()函数
    这两个函数都是从键盘上读入一个字符。其调用格式为:
        getch();
        getche();
    两者的区别是: getch()函数不将读入的字符回显在显示屏幕上, 而getche()函数却将读入的字符回显到显示屏幕上。
    例7:

     #i nclude<stdio.h>
     main()
     {
          char c, ch;
          c=getch();     /*从键盘上读入一个字符不回显送给字符变量c*/
          putchar(c);    /*输出该字符*/
          ch=getche();   /*从键盘上带回显的读入一个字符送给字符变量ch*/
          putchar(ch);
     }

    利用回显和不回显的特点, 这两个函数经常用于交互输入的过程中完成暂停等功能。

    例8:

     #i nclude<stdio.h>
     main()
     {
          char c, s[20];
          printf("Name:");
          gets(s);
          printf("Press any key to confinue...");
          getch();  /*等待输入任一键*/
     }

    (2) getchar()函数
    getchar()函数也是从键盘上读入一个字符, 并带回显。它与前面两个函数的区别在于:getchar()函数等待输入直到按回车才
结束,  回车前的所有输入字符都会逐个显示在屏幕上。但只有第一个字符作为函数的返回值。
    getchar()函数的调用格式为:

        getchar();

    例9:
     #i nclude<stdio.h>
     main()
     {
          char c;
          c=getchar();   /*从键盘读入字符直到回车结束*/
          putchar(c);    /*显示输入的第一个字符*/
          getch();       /*等待按任一健*/
     }

看《匠人手记》,与匠人同行!北航出版,正在热卖!

发表评论:
载入中...

芯片专题

器件专题

软件专题

硬件专题

综合专题

项目专题

原创专题

器件检测
LCD LED
按键 触摸键
E2PROM
电池 电机
电阻 电容 电感

指令系统
软件算法
编程规范
滤波算法
串行通讯

PCB设计
I2C PWM
红外遥控
充电技术
中断 ADC 

匠人手记
匠人夜话
网络心路
一周热点串烧
从零开始玩PIC
DIY旋转时钟

广告5号位 [投放]


学习板、开发板、编程器、下载器、仿真器(查看详情……)

广告3号位 [投放]

站内搜索


站外搜索


百度  google
mp3  歌词 
图片  FLASH 
知道  文档
新闻  词典 
地图  mp3 
软件  天网 
雅虎  爱问 
搜狗  讯雷 
网讯  华军 
天空 

21IC器件搜索
百宝箱分站
  • 《匠人的百宝箱》21IC站
  • 《匠人的百宝箱》21IC笔记团队
  • 《匠人手记》21IC书友会
  • 《匠人的百宝箱》MCUBLOG站
  • 《匠人的百宝箱》MCUBLOG笔记团队
  • 《匠人的百宝箱》EDN站
  • 《匠人手记》EDN书友会
  • 《匠人的百宝箱》与非网站
  • 《匠人的百宝箱》新浪站
  • 《匠人的百宝箱》百度站
  • 《匠人的百宝箱》网易126站
  • 《匠人的百宝箱》网易163站
  • 《匠人的百宝箱》互动出版网站
  • 广告4号位 [投放]

     
     

    匠人原创

    往日酷贴

     
     
     

    大千八卦

    友情连接

    新浪新闻:
    新浪财经:
    AK58新闻:
    新浪股票:
    新浪股票:
    证券之星:

     [更多酷站连接]

     

     

    [欢迎交换连接]

    [百宝箱之与非门分舵]

    [电脑圈圈的家当]

    [IC921的博客]

    [柔月阁]

    [八楼的呼吸]

    [hotpower 的水潭]

    [xwj的文君阁]

    [所长的BLOG]

    [阿摆手记]

    [电子伙伴]

    [unaided的笔记]

    [小飞的笔记]

    [单片机开发联盟]

    [网址之家]

    [好东西网址大全]

    [美萍中文精选]

    [数字电视之家]

    [SMARTCODE电子书斋]

    [软件开发之窗]

    [Armoric]

    [我爱研发网]

    [infernal的笔记]

    [雄鹰的空中加油站]

    [SunK]

    [逍遥电子]

    [ningpanda的博客]

    [C-Design]

    [一网见天下]

    [海边淘沙]

    [嵌入式365]

    [水牛的仓库]

    [股剩是怎样炼成的]

    [PIC论坛]

    [ICC AVR开发网]

    [中国高校自动化网]

     

     

     

    MCU博客-中国电子工程师博客网 

    大学生电子网 

     

     

     

     

     

    !!! 《匠人的百宝箱》 !!!