C语言程序开发范例宝典(软件工程师典藏版)
上QQ阅读APP看书,第一时间看更新

第7章 库函数调用

7.1 时间转换和操作函数

涉及系统时间和日期的函数需要头文件time.h来定义它们的原型,Turbo C中还包含一些非标准的时间和日期函数,它们不属于常规的时间和日期系统,并且与DOS有着密切联系。本节介绍一些关于时间转换和操作的函数。

实例188 固定格式输出当前时间

本实例是一个提高基础技能的程序

实例位置:光盘\mingrisoft\07\188

实例说明

编程实现将当前时间用以下形式输出:

星期月日小时:分:秒 年

运行结果如图7.1所示。

图7.1 固定格式输出当前时间

技术要点

本程序中用到3个与时间相关的函数,下面逐一介绍。

● time()函数

        time_t time(time_t *t)

该函数的作用是获取以秒为单位的,以格林威治时间1970年1月1日00:00:00开始计时的当前时间值作为time()函数的返回值,并把它存在t所指的区域中(在不需要存储的时候通常为NULL)。该函数的原型在time.h中。

● localtime()函数

        struct tm *localtime(const time_t *t)

该函数的作用是返回一个指向从tm形式定义的分解时间的结构的指针。t的值一般情况下通过调用time()函数来获得。该函数的原型在time.h中。

● asctime()函数

        char *asctime(struct tm *p)

该函数的作用是返回指向一个字符串的指针。p指针所指向的结构中的时间信息被转换成如下格式:

星期 月 日 小时:分:秒 年

该函数的原型在time.h中。

实现过程

(1)在TC中创建一个C文件。

(2)引用头文件:

        #include <stdio.h>
        #include <stdlib.h>
        #include <time.h>

(3)调用time函数获取当前时间信息,再调用localtime函数分解时间,最后使用asctime()函数将时间以指定格式输出。

(4)主函数程序代码如下:

        main()
        {
            time_t Time;                               /*定义Time为time_t类型*/
            struct tm*t;                               /*定义指针t为tm结构类型*/
            Time=time(NULL);                         /*将time函数返回值存到Time中*/
            t=localtime(&Time);                      /*调用localtime函数*/
            printf("Local time is:%s",asctime(t)); /*调用asctime函数,以固定格式输出当前时间*/
            getch();
        }

举一反三

根据本实例,读者可以:

编写一个屏幕时钟程序,以固定格式输出当时时间。

使用clock()函数,编程求两个事件之间的间隔时间。

实例189 当前时间转换

本实例是一个提高基础技能的程序

实例位置:光盘\mingrisoft\07\189

实例说明

编程实现将当前时间转换为格林威治时间,同时将当前时间和格林威治时间输出到屏幕上。运行结果如图7.2所示。

图7.2 格林威治时间

技术要点

本程序中用到了gmtime()函数,具体使用说明如下。

● gmtime()函数

        struct tm *gmtime(const time_t *t)

该函数的作用是将日期和时间转换为格林威治时间。该函数的原型在time.h中。Gmtime()返回指向分解时间的结构的指针,该结构是一静态变量,每次调用gmtime()函数都要重写该结构。

实现过程

(1)在TC中创建一个C文件。

(2)引用头文件:

        #include <stdio.h>
        #include <stdlib.h>
        #include <time.h>

(3)调用time函数获取当前时间信息,再调用localtime和gmtime函数分解时间及将当前时间转换为格林威治时间,最后使用asctime()函数分别将当前时间及格林威治时间以指定格式输出。

(4)主函数程序代码如下:

        main()
        {
            time_t Time;                                    /*定义Time为time_t类型*/
            struct tm*t,  *gt;                              /*定义指针t和gt为tm结构类型*/
            Time=time(NULL);                              /*将time函数返回值存到Time中*/
            t=localtime(&Time);                           /*调用localtime函数*/
            printf("Local time is:%s",asctime(t));      /*调用asctime函数,以固定格式输出当前时间*/
            gt=gmtime(&Time);                             /*调用gmtime函数,将当前时间转换为格林威治时间*/
            printf("Greenwich Time is:%s",asctime(gt)); /*调用asctime函数,以固定格式输出格林威治时间*/
            getch();
        }

举一反三

根据本实例,读者可以:

编程实现每隔10s输出一次格林威治时间。

编程实现每隔1min输出一次当前时间,当当前时间为整点时输出一次格林威治时间。

实例190 显示程序运行时间

本实例是一个提高基础技能的程序

实例位置:光盘\mingrisoft\07\190

实例说明

编程实现求一个程序运行时间,以秒为单位。运行结果如图7.3所示。

图7.3 显示程序运行时间

技术要点

本程序中用到了difftime()函数,具体使用说明如下。

● difftime()函数

        double difftime(time_t time2,time_t time1)

该函数的作用是计算从参数time1到time2所经过的时间,用秒表示。该函数的原型在time.h中。

实现过程

(1)在TC中创建一个C文件。

(2)引用头文件:

        #include <time.h>
        #include <stdio.h>
        #include <dos.h>

(3)首先将当前时间赋给start,调用sleep()函数程序中断10s,再将中断后的当前时间赋给end,最后调用difftime()函数输出从start到end所经过的时间。

(4)主函数程序代码如下:

        main()
        {
            time_t start,end;                                      /*定义time_t类型变量start,end*/
            start=time(NULL);                                    /*将当前时间赋给start*/
            sleep(10);                                           /*程序中断10秒钟*/
            end=time(NULL);                                      /*将中断后的当前时间赋给end*/
            printf("runtime is:%f(s)\n",difftime(end,start));/*调用difftime函数,从start到end说经过的时间*/
            getch();
        }

举一反三

根据本实例,读者可以:

改变sleep函数中参数值,显示程序远行时间。

编写一个程序,使用difftime()函数显示程序运行时间。

实例191 获取DOS系统时间

本实例是一个提高基础技能的程序

实例位置:光盘\mingrisoft\07\191

实例说明

编程实现在屏幕中显示当前日期及时间。运行结果如图7.4所示。

图7.4 显示程序运行时间

技术要点

本程序中用到了getdate()及gettime()函数,具体使用说明如下。

● getdate()函数

        void getdate(struct date *d)

该函数的作用是将系统当前日期填入由d指向的date结构中。该函数的原型在dos.h中。

● gettime()函数

        void gettime(struct time *t)

该函数的作用是将系统当前时间填入由t指向的time结构中。该函数的原型在dos.h中。

实现过程

(1)在TC中创建一个C文件。

(2)引用头文件:

#include <dos.h>#include <stdio.h>

(3)程序中分别调用getdate函数和gettime函数来获取系统当前日期及时间。

(4)主函数程序代码如下:

        main()
        {
            struct date d;                                                          /*定义date结构体类型变量d*/
            struct time t;                                                          /*定义time结构体类型变量t*/
            getdate(&d);                                                          /*获取系统当前日期*/
            gettime(&t);                                                          /*获取系统当前时间*/
            printf("the current day is:%d--%d--%d\n",d.da_year,d.da_mon,d.da_day);/*按指定格式输出当前日期*/
            printf("the current time is:%d:%d:%d",t.ti_hour,t.ti_min,t.ti_sec);   /*按指定格式输出当前时间*/
            getch();
        }

举一反三

根据本实例,读者可以:

编程实现每隔10s输出一次DOS系统时间。

编写计时器程序。

实例192 设置DOS系统日期

本实例是一个提高基础技能的程序

实例位置:光盘\mingrisoft\07\192

实例说明

编程实现将系统当前日期改为2008年10月23日,要求将原来日期和修改后的日期均显示在屏幕上。运行结果如图7.5所示。

图7.5 设置系统日期

技术要点

本程序中用到了setdate()函数,具体使用说明如下。

● setdate()函数

        void setdate(struct date *d)

该函数的作用是按照d指向的结构中指定的值设置dos系统日期。该函数的原型在dos.h中。

实现过程

(1)在TC中创建一个C文件。

(2)引用头文件:

        #include <dos.h>
        #include <stdio.h>

(3)程序中分别调用getdate函数和setdate函数来获取系统当前日期及按照指定的值重新设置系统日期。

(4)主函数程序代码如下:

        main()
        {
            struct date setd,now;                          /*定义setd为date结构体变量*/
            struct date origind;                           /*定义origind为date结构体变量*/
            getdate(&origind);                           /*获取系统当前日期*/
            printf("original data is:%d--%d--%d\n", origind.da_year, origind.da_mon,
                origind.da_day);                          /*输出系统当前日期*/
            setd.da_year=2008;                             /*设置系统日期中年份为2008*/
            setd.da_mon=10;                                /*设置系统日期中月份为10*/
            setd.da_day=23;                                /*设置系统日期中日为23*/
            setdate(&setd);                              /*使用setdate()按照上面指定的数据对系统时间进行设置*/
            getdate(&now)                               /*获取系统重新设置后的当前日期*/
            printf("date after setting is:%d--%d--%d", now.da_year, now.da_mon,
                now.da_day);                              /*输出设置后的系统时间*/
            getch();
        }

举一反三

根据本实例,读者可以:

编写程序将当前DOS系统日期改为1985年5月25日。

编写程序实现每隔一段时间自动更改DOS系统日期。

实例193 设置DOS系统时间

本实例是一个提高基础技能的程序

实例位置:光盘\mingrisoft\07\193

实例说明

编程实现将系统当前时间改为10:5:12,要求将原来时间和修改后的时间均显示在屏幕上。运行结果如图7.6所示。

图7.6 设置系统时间

技术要点

本程序中用到了settime()函数,具体使用说明如下。

● settime()函数

        void settime(struct time *t)

该函数的作用是按照t指向的结构中指定的值设置DOS系统时间。该函数的原型在dos.h中。

实现过程

(1)在TC中创建一个C文件。

(2)引用头文件:

        #include <dos.h>
        #include <stdio.h>

(3)程序中分别调用gettime函数和settime函数来获取系统当前时间及按照指定的值重新设置系统时间。

(4)主函数程序代码如下:

        main()
        {
            struct time sett,now;                               /*定义sett,now为time结构体变量*/
            struct time origint;                                /*定义origint为time结构体变量*/
            gettime(&origint);                                /*获取系统当前时间*/
            printf("original time is:%d:%d:%d\n", origint.ti_hour, origint.ti_min,
              origint.ti_sec);                                 /*输出系统当前时间*/
            sett.ti_hour=10;                                    /*设置系统时间中小时为10*/
            sett.ti_min=5;                                      /*设置系统时间中分为5*/
            sett.ti_sec=12;                                     /*设置系统时间中秒为12*/
            sett.ti_hund = 32;
            settime(&sett);                                   /*使用settime()按照指定的数据对系统时间进行设置*/
            gettime(&now);
            printf("time after setting is:%d:%d:%d", now.ti_hour, now.ti_min,
              now.ti_sec);                                     /*输出设置后的系统时间*/
            getch();
        }

举一反三

根据本实例,读者可以:

编写程序将当前DOS系统时间改为1985年5月25日。

编写程序实现每隔一段时间自动更改DOS系统时间。

实例194 读取并设置bios的时钟

本实例是一个提高基础技能的程序

实例位置:光盘\mingrisoft\07\194

实例说明

编程实现利用biostime()函数读取并设置bios时钟。运行结果如图7.7所示。

图7.7 读取并设置bios时钟

技术要点

本程序中用到了biostime()函数,具体使用说明如下。

● biostime()函数

        long biostime(int cmd,long newtime)

该函数的作用是读取或设置bios的时钟,如果cmd为0,biostime()返回该时钟的当前值。如果cmd为1,biostime()把时钟设置为newtime的值。函数的原型在bios.h中。

注意:bios的时钟以每秒约18.2次的脉冲速率运行。它的值在午夜12点时为0,随时间不断增长,直到午夜12点又重设为0,或者被人为的设置成某个值。

实现过程

(1)在TC中创建一个C文件。

(2)引用头文件:

        #include <bios.h>
        #include <stdio.h>

(3)程序中调用了biostime()函数来读取和设置bios的时钟,并将读取出的结果输出到屏幕上。

(4)主函数程序代码如下:

        main()
        {
            long origin, new;
            origin=biostime(0,0);                                /*调用biostime函数读取时钟的当前值*/
            printf("\nthe current time is %ld\n",origin);        /*将获取的当前值输出*/
            new=biostime(1,500);                                 /*设置bios的时钟*/
            printf("the new time is %ld",new);                   /*输出设置后的时间*/
        }

举一反三

根据本实例,读者可以:

编程实现每隔一段时间输出一次BIOS时间。

编程实现每隔一段时间重新设置一次BIOS时间。

7.2 数学函数

在编写程序的过程中往往要用到一些数学计算,适当地调用一些数学函数会使程序的编写工作变得相对简单一些,本节介绍的几个数学函数都包含在math.h中,因为它们都返回双精度的数据类型。

实例195 求相对的最小整数

本实例是一个提高基础技能的程序

实例位置:光盘\mingrisoft\07\195

实例说明

利用数学函数实现以下功能:从键盘中输入一个数,求出不小于该数的最小整数。运行结果如图7.8所示。

图7.8 设置系统时间

技术要点

本程序中用到了ceil()函数,具体使用说明如下。

● ceil()函数

        double ceil(double num)

该函数的作用是找出不小于num的最小整数,返回值为大于或等于num的最小整数值。该函数的原型在math.h中。

实现过程

(1)在TC中创建一个C文件。

(2)引用头文件:

        #include <stdio.h>
        #include <math.h>

(3)从键盘中任意输入一个数赋给变量i,使用ceil()函数求出不小于i的最小整数并将其输出。

(4)主函数程序代码如下:

        main()
        {
            float i,k;                             /*定义变量i,k为单精度型*/
            printf("please input a number:\n");
            scanf("%f",&i);                      /*输入一个数赋给变量i*/
            printf("the result is:\n");
            printf("%f",ceil(i));              /*调用ceil函数,求出不小于i的最小整数*/
        }

举一反三

根据本实例,读者可以:

编程求整数相除的商和余数(使用div函数)。

编程求浮点数的尾数和指数(使用frexp函数)。

实例196 求直角三角形斜边

本实例是一个提高基础技能的程序

实例位置:光盘\mingrisoft\07\196

实例说明

利用数学函数实现以下功能:从键盘中输入一个直角三角形的两边,求出其直角边并将其显示在屏幕上。运行结果如图7.9所示。

图7.9 设置系统时间

技术要点

本程序中用到了hypot()函数,具体使用说明如下。

● hypot()函数

        double hypot(double a,double b)

该函数的作用是对给定的直角三角形的两个直角边,求其斜边的长度,函数的返回值为所求的斜边值。该函数的原型在math.h中。

实现过程

(1)在TC中创建一个C文件。

(2)引用头文件:

        #include <stdio.h>
        #include <math.h>

(3)从键盘中任意输入直角三角形的两边分别赋给a和b,使用hypot()函数求出直角三角形的斜边长并将其输出。

(4)主函数程序代码如下:

        main()
        {
            float a, b, c;
            printf("please input two orthogonal sides:\n");
            scanf("%f,%f",&a,&b);                               /*从键盘中输入两个直角边*/
            c=hypot(a,b);                                       /*调用hypot函数,返回斜边值赋给c*/
            printf("hypotenuse is:%f\n",c);                     /*将斜边值输出*/
            getch();
        }

举一反三

根据本实例,读者可以:

不使用函数从键盘中输入两个直角边的长度,求出斜边的长度。

从键盘中输入两个直角边的长度,求出斜边的长度及两个余角的大小。

实例197 小数分离

本实例是一个提高基础技能的程序

实例位置:光盘\mingrisoft\07\197

实例说明

利用数学函数实现以下功能:从键盘中输入一个小数,将其分解成整数部分和小数部分并将其显示在屏幕上。运行结果如图7.10所示。

图7.10 小数分离

技术要点

本程序中用到了modf()函数,具体使用说明如下。

● modf()函数

        double modf(double num,double *i)

该函数的作用是把num分解成整数部分和小数部分,该函数的返回值为小数部分,把分解出的整数部分存放到由i所指的变量中。该函数的原型在math.h中。

实现过程

(1)在TC中创建一个C文件。

(2)引用头文件:

        #include <stdio.h>
        #include <math.h>

(3)从键盘中输入要分解的小数赋给变量number,使用modf()函数将该小数分解,将分解出的小数部分作为函数返回值赋给f,整数部分赋给i,最终将分解出的结果按指定格式输出。

(4)主函数程序代码如下:

        main()
        {
            float number;
            double f, i;
            printf("input the number:");
            scanf("%f",&number);                                     /*输入要分解的小数*/
            f=modf(number,&i);                                       /*调用modf函数进行分离*/
            printf("%f=%f+%f",number,i,f);                           /*将分离后的结果按指定格式输出*/
            getch();
        }

举一反三

根据本实例,读者可以:

从键盘中输入10个数据,分别显示这10个数据的整数部分及小数部分。

从键盘中输入一个数据,求该数据整数部分与小数部分的积。

实例198 求任意数n次幂

本实例是一个提高基础技能的程序

实例位置:光盘\mingrisoft\07\198

实例说明

利用数学函数实现以下功能:分别从键盘中输入底数及次幂,求出从该次幂开始的连续5个结果,要求每次次幂数加1。运行结果如图7.11所示。

图7.11 小数分离

技术要点

本程序中用到了pow()函数,具体使用说明如下。

● pow()函数

        double pow(double base,double exp)

该函数的作用是计算以base为底的exp次幂baseexp。该函数的原型在math.h中。

注意:如果base为零或者exp小于零,则出现定义域错误,如果上溢则出现数出界错误。

实现过程

(1)在TC中创建一个C文件。

(2)引用头文件:

        #include <stdio.h>
        #include <math.h>

(3)从键盘中输入要分解的小数赋给变量number,使用modf()函数将该小数分解,将分解出的小数部分作为函数返回值赋给f,整数部分赋给i,最终将分解出的结果按指定格式输出。

(4)主函数程序代码如下:

        main()
        {
            float x, n;
            int i;
            printf("please input the base:\n");
            scanf("%f",&x);                                           /*输入底数x*/
            printf("please input the power:\n");
            scanf("%f",&n);                                           /*输入次幂数*/
            for(i = 1; i <= 5; i++)
            {
                printf("%.1f^%.1f is %.3f\n",x,n,pow(x,n));         /*将求出的结果输出*/
                n += 1;
            }
            getch();
        }

举一反三

根据本实例,读者可以:

从键盘中输入10个数据,分别求出这10个数据的3次方的值。

从键盘中输入两个数据,求一个数据2次方及另一个数据3次方的和。

7.3 字符串、字符函数

Turbo C标准库具有丰富而广泛的字符串、字符的函数集。在C语言中,字符串是以空结尾的字符数组,并且在内存中是相邻排列的存储块,而字符是一个单字节的值。字符串函数和字符函数一般都在string.h和ctype.h中。本实例就介绍了几个平时不太常见的函数,掌握这些函数对快速编程很有帮助。

实例199 函数实现字符匹配

本实例是一个提高基础技能的程序

实例位置:光盘\mingrisoft\07\199

实例说明

从键盘中输入一字符串,再输入要查找的字符,在屏幕上输出字符在字符串中的位置并将从该字符开始的余下字符串内容全部输出。运行结果如图7.12所示。

图7.12 字符匹配

技术要点

本程序中用到了strchr()函数,具体使用说明如下。

● strchr()函数

        char *strchr(char *str,char ch)

该函数的作用是返回由str所指向的字符串中首先出现ch的位置指针,如果未发现与ch匹配的字符,则返回空指针。函数的原型在string.h中。

实现过程

(1)在TC中创建一个C文件。

(2)引用头文件:

        #include <stdio.h>
        #include <string.h>

(3)从键盘中输入一字符串,再输入要查找的字符,调用strchr()函数,返回指向该字符在字符串中首次出现的位置。

(4)主函数程序代码如下:

        main()
        {
            char string[50];
            char *str, ch;
            printf("please input string:\n");
            gets(string);                                                  /*输入字符串到数组str中*/
            printf("please input the character which do you want to find:\n");
            scanf("%c",&ch);                                               /*输入要进行匹配的字符*/
            str=strchr(string,ch);                                         /*调用strchr()函数*/
            if(str)                                                       /*判断返回的指针是否为空*/
            {
              printf("the character %c is at position:%d\n",ch,str-string);/*将字符出现的位置输出*/
              printf("the rest string from %c is:%s\n",ch,str);            /*输出余下字符*/
            }
            else
              printf("the character was not found.\n");                    /*当未找到时输出提示信息*/
        }

举一反三

根据本实例,读者可以:

输入一个六位数,输入任意数,查找该数字是否在这个六位数中。

实例200 任意大写字母转小写

本实例是一个提高基础技能的程序

实例位置:光盘\mingrisoft\07\200

实例说明

利用函数strlwr()实现将输入的大写字母转换成小写字母。运行结果如图7.13所示。

图7.13 任意大写字母转小写

技术要点

本程序中用到了strlwr()函数,具体使用说明如下。

● strlwr()函数

        char *strlwr(char *str)

该函数的作用是把str所指向的字符串变为小写字母,该函数的原型在string.h中。

实现过程

(1)在TC中创建一个C文件。

(2)引用头文件:

        #include <stdio.h>
        #include <string.h>

(3)从键盘中输入字符串,调用strlwr()函数实现将大写字母转换成小写字母,最终将转换的结果输出。

(4)主函数程序代码如下:

        main()
        {
            char str[50];
            printf("please input string:\n");
            gets(str);                                            /*输入字符串*/
            strlwr(str);                                          /*调用strlwr函数,实现大写字母转小写字母*/
            printf(str);                                          /*将转换后的结果输出*/
        }

举一反三

根据本实例,读者可以:

读取磁盘文件中的字符,将大写字母转换成小写字母显示在屏幕上。

编写大小写字母转换器。

实例201 字符串复制到指定空间

本实例是一个提高基础技能的程序

实例位置:光盘\mingrisoft\07\201

实例说明

从键盘中输入字符串1和字符串2,将字符串内容保存到内存空间中。运行结果如图7.14所示。

图7.14 字符串复制到指定空间

技术要点

本程序中用到了strdup()函数,具体使用说明如下。

● strdup()函数

        char *strdup(char *str)

该函数的作用有两个:第一,按字符串str的长度在内存中分配出空间;第二,将str的内容复制到该空间中。该函数返回指向该存放区域的指针。strdup()函数的原型在string.h中。

实现过程

(1)在TC中创建一个C文件。

(2)引用头文件:

        #include <string.h>
        #include <stdio.h>

(3)从键盘中输入字符串1和字符串3,调用strdup()函数实现在内存中根据这两个字符串的长度为其分配存储空间,并将两个字符串中的内容复制到分配的空间中,分别返回指向该空间的指针。

(4)主函数程序代码如下:

        main()
        {
            char str1[30],str2[30],  *p1,  *p2;
            printf("please input string1:");
            gets(str1);                                      /*从键盘中输入字符串1*/
            printf("please input string2:");
            gets(str2);                                      /*从键盘中输入字符串2*/
            p1=strdup(str1);                                 /*p1指向存放字符串1的地址*/
            p2=strdup(str2);                                 /*p2指向存放字符串2的地址*/
            printf("string1:%s\nstring2:%s",p1,p2);          /*利用指针输出字符串*/
        }

举一反三

根据本实例,读者可以:

读取磁盘文件中的字符串并复制到指定的空间中。

读取磁盘文件中的字符串并复制到指定的空间中,再将该字符串从指定空间中复制出存到另一个磁盘文件中。

实例202 查找位置信息

本实例是一个提高基础技能的程序

实例位置:光盘\mingrisoft\07\202

实例说明

从键盘中输入str1和str2,查找str1字符串中第一个不属于str2字符串中字符的位置,并将该位置输出;再从键盘中输入str3和str4,查找在str3中是否包含str4,无论包含与否给出提示信息。运行结果如图7.15所示。

图7.15 查找位置信息

技术要点

本程序中用到了strspn()与strstr()函数,具体使用说明如下。

● strspn()函数

        char *strspn(char *str1,char *str2)

该函数的作用是在str1字符串中寻找第一个不属于str2字符串中字符的位置。该函数返回str1中第一个与str2任一个字符不相匹配的字符下标。该函数的原型在string.h中。

● strstr()函数

        char *strstr(char *str1,char *str2)

该函数的作用是在字符串str1中寻找str2字符串的位置,并返回指向该位置的指针,如果没有找到相匹配的就返回空指针。

实现过程

(1)在TC中创建一个C文件。

(2)引用头文件:

        #include <string.h>
        #include <stdio.h>

(3)从键盘中输入字符串1和字符串3,调用strspn()函数实现在str1字符串中寻找第一个不属于str2字符串中字符的位置,从键盘中输入字符串3和字符串4,调用strstr()函数实现在字符串str3中寻找str4字符串的位置,并返回指向该位置的指针。

(4)主函数程序代码如下:

        main()
        {
            char str1[30],str2[30],str3[30],str4[30],  *p;
            int pos;
            printf("please input string1:");
            gets(str1);                                                /*从键盘中输入字符串1*/
            printf("please input string2:");
            gets(str2);                                                /*从键盘中输入字符串2*/
            pos=strspn(str1,str2);                                     /*调用函数strspn找出不同的位置*/
            printf("the position you want to find is:%d\n", pos);
            printf("please input string3:");
            gets(str3);                                                /*从键盘中输入字符串3*/
            printf("please input string4:");
            gets(str4);                                                /*从键盘中输入字符串4*/
            p=strstr(str3,str4);                                       /*调用函数strstr查看str3中是否包含str4*/
            if(p)
                printf("str3 include str4\n");
            else
                printf("can not find str4 in str3!");
        }

举一反三

根据本实例,读者可以:

从两个不同的磁盘文件中分别读取字符串1和字符串2,查找字符串1中第一个不属于字符串2中字符的位置,并将该位置输出。

从两个不同的磁盘文件中分别读取字符串1和字符串2,查找在字符串1中是否包含字符串2,无论包含与否给出提示信息。

7.4 其他函数

在本节中介绍的函数都是不能简单地归属某一类标准函数的,所以在这里单独介绍一下,掌握这些函数,会使编写程序的过程中少走许多弯路,因为不是归属同一类的函数,所以头文件各有不同。

实例203 复制当前目录

本实例是一个提高基础技能的程序

实例位置:光盘\mingrisoft\07\203

实例说明

将当前的工作目录复制到数组cdir中并在屏幕上输出。运行结果如图7.16所示。

图7.16 复制当前目录

技术要点

本程序用到getdisk()函数和getcurdir()函数,具体使用说明如下。

● getdisk()函数

        int getdisk(void)

该函数的作用是返回当前驱动器名的代码。驱动器A为0,驱动器B为1,依此类推。函数的原型在dir.h中。

● getcurdir()函数

        int getcurdir(int driver,char *dir)

该函数的作用是把有driver所指定的当前工作目录拷贝到由dir所指向的字符串中,若drive为零值,则指的是默认驱动器,驱动器A用1,驱动器B用2,依此类推。

由dir所指向的字符串长度必须至少为MAXDIR个字节。MAXDIR为dir.h中定义的宏。目录名将不包含驱动器标识符,也不以反斜杠开始。函数的原型在dir.h中。

实现过程

(1)在TC中创建一个C文件。

(2)引用头文件:

        #include <stdio.h>
        #include <dos.h>
        #include <dir.h>

(3)调用函数getdisk()和getcurdir()函数实现复制当前目录。

(4)主函数程序代码如下:

        main()
        {
            char cdir[MAXDIR];
            strcpy(cdir, "c:\\");
            cdir[0]='A'+getdisk();              /*调用函数返回当前驱动器*/
            if(getcurdir(0, cdir + 3))
                                                  /*调用函数将当前目录拷贝到cdir+3开始的数组中*/
            {
              printf("error");
              exit(1);
            }
            printf("the current directory is:%s\n", cdir);
            getch();
        }

举一反三

根据本实例,读者可以:

编程实现将当前工作目录保存到指定的磁盘文件中。

编程实现改变当前目录。

实例204 产生惟一文件

本实例是一个提高基础技能的程序

实例位置:光盘\mingrisoft\07\204

实例说明

编程实现在当前目录中产生一个惟一的文件。运行结果如图7.17所示。

图7.17 产生惟一文件

技术要点

本程序用到mktemp()函数,具体使用说明如下。

● mktemp()函数

        char *mktemp(char *fname)

该函数的作用是产生一个惟一的文件名,并且把它复制到由fname所指向的字符串中。当调用mktemp()时,由fname所指向的字符串必须包含以空为结束符的6个X,该函数把这个字符串转换为惟一的文件名,但并未建立文件。如果成功,mktemp()函数返回指向fname的指针,否则返回空。函数的原型在dir.h中。

实现过程

(1)在TC中创建一个C文件。

(2)引用头文件:

        #include <stdio.h>
        #include <dir.h>

(3)调用函数mktemp()函数产生一个惟一的文件。

(4)主函数程序代码如下:

        main()
        {
        char*filename="mingriXXXXXX",*p;                     /*为filename赋值*/
        p=mktemp(filename);                                /*调用函数产生惟一文件名,返回值赋给p*/
        printf("%s\n",p);
        getch();
        }

举一反三

根据本实例,读者可以:

编程实现在指定目录中创建惟一文件(使用creattemp)。

编程实现判断读写所在的文件的位置(ftell)。

实例205 不同亮度显示

本实例是一个提高基础技能的程序

实例位置:光盘\mingrisoft\07\205

实例说明

日常操作中经常会发现有些字符串在屏幕中显示的亮度不同,本实例要求在屏幕上以不同亮度即高亮度、低亮度及正常亮度显示字符串,运行结果如图7.18所示。

图7.18 不同亮度显示

技术要点

本程序用到highvideo()、lowvideo()、normvideo()函数,具体使用说明如下。

● highvideo()函数

        void highvideo(void)

该函数的作用是写到屏幕上的字符以高亮度显示。函数的原型在conio.h中。

● normvideo()函数

        void normvideo(void)

该函数的作用是写到屏幕上的字符以正常亮度显示。函数的原型在conio.h中。

● lowvideo()函数

        void lowvideo(void)

该函数的作用是写到屏幕上的字符以低亮度显示。函数的原型在conio.h中。

实现过程

(1)在TC中创建一个C文件。

(2)引用头文件:

        #include <conio.h>

(3)调用highvideo()、lowvideo()、normvideo()函数使字符以不同亮度显示。

(4)主函数程序代码如下:

        main()
        {
            clrscr();
            highvideo();                               /*调用函数,字符以高亮度显示*/
            gotoxy(10, 1);
            cprintf("This is high intensity text");
            lowvideo();                                /*调用函数,字符以低亮度显示*/
            gotoxy(10, 10);
            cprintf("This is low intensity text");
            normvideo();                               /*调用函数,字符以正常亮度显示*/
            gotoxy(10, 20);
            cprintf("This is normal intensity text");
            getch();
        }

举一反三

根据本实例,读者可以:

从磁盘文件中读出一组字符串,以低亮度显示。

从键盘中输入一字符串,以高亮度显示。

实例206 字母检测

本实例是一个提高基础技能的程序

实例位置:光盘\mingrisoft\07\206

实例说明

从键盘中任意输入一个字母或数字或其他字符,编程实现当输入字母时提示“输入的是字母”,否则提示“输入的不是字母”。运行结果如图7.19所示。

图7.19 字母检测

技术要点

本程序用到isalpha()函数,具体使用说明如下。

● isalpha()函数

        int isalpha(int ch)

该函数的作用是检测字母,如果ch是字母表中的字母(大写或小写),则返回非零,否则返回零。函数的原型在ctype.h中。

实现过程

(1)在TC中创建一个C文件。

(2)引用头文件:

        #include <ctype.h>
        #include <stdio.h>

(3)调用isalpha()函数检测输入的是否是字母,当输入q或Q时退出程序。

(4)主函数程序代码如下:

        main()
        {
            char ch, ch1;
            while(1)
            {
                printf("input the character('q' to quit):");
                ch=getchar();                                    /*从键盘中获得一个字符*/
                ch1=getchar();                                   /*ch1接收从键盘中输入的回车*/
                if(ch=='q'||ch=='Q')                            /*判断输入的字符是不是q或Q*/
                    break;                                         /*如果是q或Q跳出循环*/
                if(isalpha(ch))                               /*检测输入的是否是字母*/
                    printf("\n%c is a letter.\n\n", ch);
                else
                    printf("\n%c is not a letter.\n\n", ch);
            }
        }

举一反三

根据本实例,读者可以:

从键盘中任意输入一个字母或数字或其他字符,当输入的字母个数达到5个的时候,程序自动结束。

从指定的磁盘文件中读取内容,当读入的字母个数达到5个的时候,输出提示信息并将这5个字母输出到屏幕上。

实例207 建立目录

本实例是一个提高基础技能的程序

实例位置:光盘\mingrisoft\07\207

实例说明

编程实现在当前目录下在创建一个目录,创建的文件夹名称为temp,运行结果如图7.20所示。

图7.20 建立目录

技术要点

本程序用到mkdir()函数,具体使用说明如下。

● mkdir()函数

        int mkdir(char *path)

该函数的作用是由path所指向的路径名建立一个目录。该函数如果成功,则返回0,否则返回-1。函数的原型在dir.h中。

实现过程

(1)在TC中创建一个C文件。

(2)引用头文件:

        #include <dir.h>
        #include <stdio.h>

(3)调用mkdir()函数以temp为路径名建立一个目录。

(4)主函数程序代码如下:

        main()
        {
            if(!mkdir("temp"))                                    /*调用函数应temp为路径名建立一个目录*/
              printf("directory test is created\n");                 /*目录建成输出提示信息*/
            else
            {
              printf("unable to create new directory\n");            /*目录未建成也同样输出提示信息*/
              exit(1);
            }
            getch();
        }

举一反三

根据本实例,读者可以:

编程实现创建目录后再改变目录。

编程实现改变当前目录后再创建目录。

实例208 删除目录

本实例是一个提高基础技能的程序

实例位置:光盘\mingrisoft\07\208

实例说明

编程实现在当前目录下在创建一个目录,创建完成后按任意键将该目录删除。运行结果如图7.21所示。

图7.21 删除目录

技术要点

本程序用到mkdir()函数,具体使用说明如下。

● rmdir()函数

        int rmdir(char *path)

该函数的作用是删除由path所指向的路径名和目录。删除时,目录必须是空的,必须不是当前工作目录,也不能是根目录。函数的原型在dir.h中。

实现过程

(1)在TC中创建一个C文件。

(2)引用头文件:

        #include <dir.h>
        #include <stdio.h>

(3)调用mkdir()函数以temp为路径名建立一个目录。

(4)主函数程序代码如下:

        main()
        {
            char*name[10];                                  /*定义字符型数组存储文件名*/
            printf("please input directory name:\n");
            scanf("%s",name);                             /*输入文件名*/
            printf("Press any key,and the directory will be removed\n");
            getch();
            if(!rmdir(name))
                                                            /*删除目录*/
                printf("Directory is removed.\n");
                                                            /*删除成功输出提示信息*/
            else
                printf("can not remove");
                                                            /*删除不成功输出提示信息*/
            getch();
        }

举一反三

根据本实例,读者可以:

编程实现删除当前目录中已有的目录。

编程实现获取当前磁盘驱动器。

实例209 数字检测

本实例是一个提高基础技能的程序

实例位置:光盘\mingrisoft\07\209

实例说明

从键盘中任意输入一个字母或数字或其他字符,编程实现当输入数字时提示“输入的是数字”,否则提示“输入的不是数字”。运行结果如图7.22所示。

图7.22 数字检测

技术要点

本程序用到isalpha()函数,具体使用说明如下。

● isdigit()函数

        int isdigit(int ch)

该函数的作用是检测数字,如果ch是数字则函数返回非零值,否则返回零。函数的原型在ctype.h中。

实现过程

(1)在TC中创建一个C文件。

(2)引用头文件:

        #include <ctype.h>
        #include <stdio.h>

(3)调用isdigit()函数检测输入的是否是数字,当输入q或Q时退出程序。

(4)主函数程序代码如下:

        main()
        {
            char ch, ch1;
            while(1)
            {
              printf("input the character('q' to quit):");
              ch=getchar();                                         /*从键盘中获得一个字符*/
              ch1=getchar();                                        /*ch1接收从键盘中输入的回车*/
              if(ch=='q'||ch=='Q')                                 /*判断输入的字符是不是q或Q*/
                    break;                                            /*如果是q或Q跳出循环*/
              if(isdigit(ch))                                    /*检测输入的是否是数字*/
                    printf("\n%c is digit.\n\n", ch);
              else
                    printf("\n%c is not a digit.\n\n", ch);
            }
        }

举一反三

根据本实例,读者可以:

从键盘中任意输入一个字母或数字或其他字符,当输入的数字个数达到5个的时候,程序自动结束。

从指定的磁盘文件中读取内容,当读入的数字个数达到5个的时候,输出提示信息并将这5个数字输出到屏幕上。

实例210 快速分类

本实例是一个提高基础技能的程序

实例位置:光盘\mingrisoft\07\210

实例说明

对包含10个元素125、-26、53、12、-6、95、46、85、-45、785的数组分别进行升序和降序排列。运行结果如图7.23所示。

图7.23 快速分类

技术要点

本程序用到qsort()函数,具体使用说明如下。

● qsort()函数

        void qsort(void *base,int num,int size,int(*compare)())

该函数的作用是用快速分类法对由base所指向的数组分类。数组被分类直到结尾。数组中的元素个数由num给出,并且每个元素的大小由size描述。

由compare所指向的函数比较数组的元素,compare函数的形式必须为:

        func_name(arg1,arg2)
        void *arg1,*arg2;

返回值的情况如下。

● 如果arg1<arg2,则返回值小于0。

● 如果arg1=arg2,则返回值等于0。

● 如果arg1>arg2,则返回值大于0。

实现过程

(1)在TC中创建一个C文件。

(2)引用头文件:

        #include <ctype.h>
        #include <stdio.h>

(3)调用qsort()函数将原数组分别以升序和降序输出。

(4)主函数程序代码如下:

        main()
        {
            int i, comp1(), comp2();
            clrscr();                                      /*清屏*/
            printf("the original array is:\n");
            for(i=0;i<10;i++)                             /*将数组按原序输出*/
                printf("%10d", num[i]);
            qsort(num, 10, sizeof(int), comp1);
            printf("\n The accending sorted array is:\n");
            for(i=0;i<10;i++)                             /*将数组按升序输出*/
                printf("%10d", num[i]);
            qsort(num, 10, sizeof(int), comp2);
            printf("\n The decending sorted array is:\n");
            for(i=0;i<10;i++)                             /*将数组按降序输出*/
                printf("%10d", num[i]);
            getch();
        }
        comp1(int *i, int *j)
        {
            return  *i-  *j;
        }
        comp2(int *i, int *j)
        {
            return  *j-  *i;
        }

举一反三

根据本实例,读者可以:

调用qsort()函数,对任意一组进行升序排序后将其以降序顺序输出。

调用qsort()函数,对输入的学生成绩进行排名。

实例211 访问系统temp中的文件

本实例是一个提高基础技能的程序

实例位置:光盘\mingrisoft\07\211

实例说明

编程实现访问系统temp目录中的文件,并将文件内容显示在屏幕上。运行结果如图7.24所示。

图7.24 访问系统temp中的文件

技术要点

本实例访问系统temp目录时使用了getnev()函数,具体使用说明如下。

● getnev()函数

        char *getnev(char *name)

该函数的作用是返回一个指向环境信息的指针,该信息与由name所指向的在DOS环境信息表中有关的字符串有关。如果用一个与任何环境数据都不匹配的参数调用getnev(),则返回的是空指针。该函数的原型在stdlib.h中。

实现过程

(1)在TC中创建一个C文件。

(2)引用头文件:

        #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>

(3)调用getnev()函数获取temp目录,再打文件夹中指定文件,利用while循环将文件中的内容输出到屏幕上。

(4)主函数程序代码如下:

        main()
        {
            char *pathname, filename[30], ch;
            FILE *fp;
            pathname=getenv("TEMP");                         /*获取临时文件夹路径*/
            printf("\nCurrent path is:%s\n",pathname);       /*将临时文件夹路径输出*/
            printf("press any key to open one file!");
            getch();
            strcat(pathname,"\\new.txt");                    /*连接文件名*/
            strcpy(filename,pathname);                       /*将完整的文件路径名复制到filename中*/
            if((fp = fopen(filename, "r"))!= NULL)
            {
              printf("\nThe name of the file is");
              printf("\n%s",filename);                       /*输出文件路径名*/
              printf("\nThe content of the file is");
              printf("\n");
              ch = fgetc(fp);
              while(ch != EOF)
                                                               /*读取文件中的内容*/
                {
                    printf("%c", ch);
                    ch = fgetc(fp);
                }
                fclose(fp);                                  /*关闭文件*/
            }
            else
                printf("can not open!");
                                                               /*若文件未打开输出提示信息*/
        }

举一反三

根据本实例,读者可以:

编程实现将获取的系统临时文件目录存储到指定的磁盘文件中。

编程实现将读取的系统临时文件中的内容存储到指定的磁盘文件中。

实例212 设置组合键

本实例是一个提高基础技能的程序

实例位置:光盘\mingrisoft\07\212

实例说明

编程实现检测Ctrl+Break的当前状态,并设置Ctrl+Break状态显示在屏幕上。运行结果如图7.25所示。

图7.25 检测Ctrl+Break状态

技术要点

本实例中分别使用了getcbrk()函数和setcbrk()函数来获取Ctrl+Break当前状态和设置当前Ctrl+Break状态,具体使用说明如下。

● getcbrk()函数

        int getcbrk(void)

该函数的作用是检测Ctrl+Break是关闭还是打开,当关闭时函数返回0,当打开时函数返回1。该函数的原型在dos.h中。

● setcbrk()函数

        int setcbrk(int cbrkvalue)

该函数的作用是设置Ctrl+Break的检测状态为on或off。若cbrkvalue=0,则检测状态置为off,若cbrkvalue=1,则检测状态置为on。该函数的原型在dos.h中。

实现过程

(1)在TC中创建一个C文件。

(2)引用头文件:

        #include <stdio.h>
        #include <dos.h>

(3)调用getcbrk()函数和setcbrk()函数来获取和设置当前ctrl+break状态,并将获取的状态输出到屏幕上。

(4)主函数程序代码如下:

        main()
        {
            printf("\n The status of Ctrl+Break %s",(getcbrk())? "On" : "Off");
                                                                  /*检测当前ctrl+break状态并输出*/
            printf("\npress any key to see the status of Ctrl+Break:");
            getch();
            setcbrk(1);                                         /*设置ctrl+break状态为on*/
            printf("\n The status of Ctrl+Break %s",(getcbrk())? "On" : "Off");
                                                                  /*检测当前ctrl+break状态并输出*/
            printf("\npress any key to see the status of Ctrl+Break:");
            getch();
            setcbrk(0);                                         /*设置ctrl+break状态为off*/
            printf("\n The status of Ctrl+Break %s\n",(getcbrk())? "On" : "Off");
                                                                  /*检测当前ctrl+break状态并输出*/
        }

举一反三

根据本实例,读者可以:

使用biosprint()函数返回打印机信息。

使用ctrlbrk()函数来代替DOS调用的控制结束处理程序。