鱼C论坛

 找回密码
 立即注册
查看: 81|回复: 0

[学习笔记] 每日一学22

[复制链接]
发表于 2024-12-19 16:41:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 6bingame 于 2024-12-19 17:15 编辑

标准C库函数4

字符串填充函数

字符串填充函数用于快速赋值一个字符到一个字符串,形式如下

原型                                                        功能
void*memset(void*d;char c,int n)            使用n个字符c填充void*类型变量d

例题1:字符串填充函数的应用
#include<stdio.h>

#include<string.h>          //包含字符串处理头文件

int main()
{
    char array[]="Hello world";

    char*s=array;

    memset(s,'W',5);        //调用字符串填充函数

    printf("%s",s);

    getchar();              //等待键入字符

    return 0;
}


例题分析:
把指针所指内存存储空间的前5个字符,使用字符'W'填充。



字符处理函数

除了字符串处理函数之外,还有标准C语言字符处理函数,这些函数包含在头文件<cytpe.h>中,要使用这些字符处理函数,需要包含该头文件。

原型                            功能
int isalnum(int c)              如果整数c是文字或数字返回非零,否则返回零
int isalpha(int c)              如果整数c是一个字母返回非零,否则返回零
int iscntrl(int c)              如果整数c是一个控制符返回非零,否则返回零
int isdigit(int c)              如果整数c是一个数字返回非零,否则返回零
int isgraph(int c)              如果整数c是可以打印的(排除空格)返回非零,否则返回零
int islower(int c)              如果整数c是小写字母返回非零,否则返回零
int isprint(int c)              如果整数c是可以打印的(包括空格)返回非零,否则返回零
int ispunct(int c)              如果整数c是可以打印的(除了空格、字母或数学之外)返回非零,否则返回零
int isspace(int c)              如果整数c是一个空格返回非零,否则返回零
int isupper(int c)              如果整数c是大小字母返回非零,否则返回零
int isxdigit(int c)             如果整数c是十六进制数字返回非零,否则返回零

例题2:字符类型判断函数的应用
#include<stdio.h>

#include<ctype.h>

#include<string.h>

int main()
{
    char s1[]="Test Line 1\tend\n Test Line 2\r";

    char s2[]="Hello,Rain!";

    int i;

    printf("空白符判断\n");

    for(i=0;i<strlen(s1);i++)
    {
        if(isspace(s1[i]))      //调用字符判断函数
        {
            putchar('.');

        }
        else
        {
            putchar(s1[i]);
        }
    }
    printf("\n\n");

    printf("标点符号判断\n");

    for(i=0;i<strlen(s2);i++)
    {
        if(ispunct(s2[i]))
            {
                printf("^");
            }      //调用字符判断函数
        else
            {
                printf(".");
            }
    }
    getchar();          //等待键入字符

    return 0;
}

例题分析:
isspace(int c)函数的功能是判断字符c是否为空白符,当c为空白符时,返回非零值,否则返回零。空白符指空格、水平制表、垂直制表、换页、回车和换行符等。
ispunct(int c)函数的功能是判断字符c是否为标点符号,当c为标点符号时,返回非零值,否则返回零。标点符号指那些既不是字母数字,也不是空格的可打印字符。




字符大小写转换函数

字符大小写转换函数用于字母大小写互换,形式如下

原型                                功能
int tolower(int c)              转换整数c为小写字母。当c为小写写字母时,则返回对应的大写字母,否则返回原来的值
int toupper(int c)              转换整数c为大写字母。当c为大写写字母时,则返回对应的小写字母,否则返回原来的值



转换和存储管理函数

转换函数和存储管理函数的原型都包含在<stdlib.h>头文件中,使用这些函数时需要包含这个头文件。


转换函数

下表列出的库函数用于把字符串转换为整形或者浮点型数据类型,或者把整形和浮点型数据类型转换为字符串


原型                                            功能
int atoi(string)                                转换一个ASCII字符串为一个整数,在第一个非整型字符处停下
double atof(string)                             转换一个ASCII字符串为一个双精度数,在第一个不能被解释为一个双精度数的字符处停止
string itoa(int,char*,int)              转换一个整数为一个ASCII字符串,为返回的字符串分配的空间必须

例题3:转换函数的应用
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int num=12345;

    char * str="12345.67";

    char array[10];

    itoa(num,array,sizeof(array));      //调用转换函数

    printf("num=%d,array=%s\n",num,array);

    printf("%d",atoi(str));

    getchar();          //等待键入字符

    return 0;
}

例题分析:
itoa()函数用于把整数转换为字符串,需要指定字符数组的大小




存储管理函数

下表列出的4个函数用来控制动态的分配和释放存储空间

原型                                                功能
void*malloc(size_tn)                        为一个大小为n的对象分配存储空间
void*calloc(size_n,size_n)                  为n个对象的数组分配存储空间,每个的大小为n,初始化所有被分配的内存为0
void*realloc(void*p,size_n)                 重新分配空间的大小为n,内容保持与旧的相同,等于新的大小
void free(void*p)                           释放指向的空间

尽管在实际中,malloc()和calloc()函数能够经常互换使用,但还是更推荐使用malloc()函数,因为它在这个函数中的用途更普遍。在使用malloc()请求一个新的存储空间分配时,必须给函数提供一个所需的存储数量的指示。这可以通过请求一个指定的字节数或者通过一个特殊数据类型请求足够的空间来完成。

例题4:存储管理函数的应用
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int numgrades,i;

    int *grades;

    printf("输入数值:\n");

    scanf("%d",&numgrades);

    grades = (int*)malloc(numgrades*sizeof(int));   //请求存储空间

    if(grades == (int*)NULL)            //检查空间是否正常分配
    {
        printf("分配空间失败\n");
        exit(1);
    }
    for(i=0;i<numgrades;i++)
    {
        printf("输入数据:");
        scanf("%d",&grades[i]);
    }
    printf("数组已创建,有%d个整数\n",numgrades);

    printf("存储的数组值是:\n");

    for(i=0;i<numgrades;i++)
        printf("%d\n",grades[i]);

    free(grades);

    return 0;
}

例题分析:
需要注意到,程序在使用malloc()分配存储空间后,检查了空间是否被正常分配,确保正确执行了分配指令。如果此时分配失败了,malloc()函数将被返回NULL指针,程序中断执行。所以,动态分配存储空间时,大家一定要检查返回值,这是非常重要的。




随机函数

在解决许多商业和科学问题的过程中,通常会使用概率统计学的取样技术。例如,在模拟流通流量和电信流量的模型中,要求有统计模型。
另外,类似简单的计算机游戏和更多包含博彩类的游戏中,这样的应用只能由统计学来描述。所有的这些统计学模型都要求产生随机数,也就是次序不能预测的一系列数字。


初识随机函数

在实践中,找到真正的随机数字是困难的。数字计算机只能在一个限定的范围内和有限的精度下去处理数字。在大多数情况下,一个人能够的最好方法是产生伪随机数,
这不是真正意义的随机数,它的意义是,单次产生的数列是无法预测的,但是每次都会生成同样的一组随机数列。

标准C函数库提供了一个随机数函数,即rand()函数,它返回[0,MAX]之间均匀分布的伪随机整数。rand()函数不接受参数,默认以1为种子(即起始值),
他总是以相同的种子开始,所以形成的伪随机数也相同,不是真正的随机。这是有意设计的,目的是为了便于程序的调试。

另一个函数是srand(),我们可以使用该函数指定不同的数(无符号整数)为种子。但是如果种子相同,那么伪随机数也相同。我们有两种方法可以采用,
一种办法是让用户输入种子,但是效果不是很理想;另外一种比较理想的方法是采用变化的数,我们常用时间作为随机数生成器的种子。这样种子不同,产生的随机数也就不同。



使用随机函数

rand()函数没有参数,它返回一个从0到最大值之间的随机整数。

例题5:随机函数的应用
#include<stdio.h>           //包含标准输入输出头文件
#include<stdlib.h>          //包含转换和存储头文件
#include<time.h>            //包含日期时间处理头文件
#define MAX 100
int main()
{
    int i;

    srand((unsigned)time(NULL));    //随机数播种函数

    for(i=0;i<10;i++)               //产生10个随机数
        printf("%d\n",rand()%MAX);  //设定随机范围并输出

    return 0;
}

例题分析:
srand()函数的参数是一个带NULL参数的time()函数。NULL参数使time()函数以秒为单位读取计算机内部时钟的时间,然后srand()函数使这个时间初始化,rand()函数设定随机函数范围,也就是我们常说的产生一个以当前时间开始的随机种子。MAX为生成随机数范围的上限值,rand()%MAX产生的随机数范围是[0,MAX-1]。



日期和时间处理函数

C语言的标准库函数包括一系列日期和时间处理函数,这些函数的原型包含在<time.h>头文件中,形式如下。

原型                                                                功能
char*asctime(const struct tm*timeptr)                将参数timeptr所指的tm结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形态返回
char*asctime(const time_t*timep)                将参数timep所指的time_t结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形态返回
struct tm*gmtime(const time_t*timep)                将参数timep所指的time_t结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果由结构tm返回
struct tm*localtime(const time_t*timep)        将参数timep所指的time_t机构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果由结构tm返回
结构tm的定义请参考gmtime()

例题6:日期和时间函数的应用
#include<stdio.h>

#include<time.h>            //包含时间日期处理头文件

int main()
{
    char*wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};

    time_t timep;

    struct tm*p;

    time(&timep);

    printf("%s",ctime(&timep));     //调用日期时间处理函数

    p=gmtime(&timep);               //调用日期时间处理函数

    printf("%s",asctime(p));        //调用日期时间处理函数

    printf("%d-%d-%d ",(1900+p->tm_year),(1+p->tm_mon),p->tm_mday);

    printf("%s %d:%d:%d\n",wday[p->tm_wday],p->tm_hour,p->tm_min,p->tm_sec);

    p=localtime(&timep);            //调用日期时间处理函数

    printf("%d-%d-%d ",(1900+p->tm_year),(1+p->tm_mon),p->tm_mday);

    printf("%s %d:%d:%d\n",wday[p->tm_wday],p->tm_hour,p->tm_min,p->tm_sec);

    return 0;
}


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-2-23 20:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表