成信大807常用函数复习

快临近考试了,这里在带领大家复习一遍常用的函数库函数,考场上可以直接调用省去一大堆的推演代码时间

目录

#include//以下函数包含使用头文件

 #include//以下函数包含使用头文件

真题函数解析 strstr

#include//以下函数包含使用头文件

2022真题  


首先是字符处理函数

因为这个我们平时使用最少但是考试最容易涉及

#include<ctype.h>//以下函数包含使用头文件

字符往往我们使用的时候经常会忽略 基本是都感觉我们在处理的是字符串 其实并不是

我们很多时候的字符串处理都是基于使用字符的方式

我们直接从代码的角度出发 理解使用函数 

#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main(){
	char str[50]="HeLlo@W 43!27 //*//";
	int alnum=0,alpha=0,digit=0;/*分别记录 数字和字母 纯字母 纯数字*/
	int graph=0;//记录可打印字符
	for(size_t i=0;i<strlen(str);i++){
		if(isalnum(str[i])){//检查是否是字母和数字 是返回非0 否则返回0
			alnum++;
		}
		if(isalpha(str[i])){//检查是否是字母 是返回非0 否则返回0
			alpha++;
		}
		if(isdigit(str[i])){//检查是否是和数字 是返回非0 否则返回0
			digit++;
		}
		if(isgraph(str[i])){//检查是否是可打印字符 是返回非0 否则返回0
			graph++;
		}
	}
	printf("数字和字母:%d 字母:%d 数字:%d 可打印字符:%d",alnum,alpha,digit,graph);
	return 0;
}

可以在要求一段程序中有多少字母 数字等时候使用 

接下来更为常用的函数介绍

#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main(){
	char str[50]="HeLlo@W 43!27 //*//";
	int lower=0,upper=0,space=0;/*分别记录 小写字母 大写字母 空*/
	for(size_t i=0;i<strlen(str);i++){
		if(islower(str[i])){//检查是否是大写字母 是返回非0 否则返回0
			lower++;
		}
		if(isupper(str[i])){//检查是否是小写字母 是返回非0 否则返回0
			upper++;
		}
		if(isspace(str[i])){//检查是否是空格 是返回非0 否则返回0
			space++;
		}
	}
	printf("大写字母:%d 小写字母:%d 空格:%d ",lower,upper,space);
	return 0;
}

这种函数方便之处就在于考试的时候不用写很长的判断

比如判断小写字母 就不用写成

if(str[i]>='a'&&str[i]<='z');

这样不仅节约了一些时间 还可以防止出错(漏掉等于之类); 

 接下来在介绍两个不怎么常用的函数

大小字母互相转化

#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main(){
	char str[50]="HeLlo@W 43!27 //*//";
	printf("大写后的字符");	
	for(size_t i=0;i<strlen(str);i++){
		printf("%c",toupper(str[i]));//返回传入字符的大写字母
	}
	printf("\n小写后的字符");	
	for(size_t i=0;i<strlen(str);i++){
		printf("%c",tolower(str[i]));//返回传入字符的小写字母	
	}

	return 0;
}

 

 #include<string.h>//以下函数包含使用头文件

 字符串函数我们不仅要会使用 而且要求我们还要熟悉使用

下面我们还是以代码来说明

首先是连接函数

#include<stdio.h>
#include<string.h>
int main(){
	char s1[50]="HeLloW";
	char s2[50]="world";
	strcat(s1,s2);//把s2连接到s1后面
	printf("%s",s1);//注意s1是被修改的 注意保证s1的空间能装下s2
}

 其次是拷贝函数

这里需要说明的是 我们通常在整数赋值的时候 直接让a等于b 或者在字符的时候 直接让字符

c1等于c2 但这里需要注意的是 字符串我们要么采用数组逐位去复制 要么使用下列函数拷贝赋值 千万不要让字符串s1等于s2(!!!严重错误)

#include<stdio.h>
#include<string.h>
int main(){
	char s1[50]="HeLloW";
	char s2[50]="world";
	strcpy(s1,s2);//把s2拷贝到s1里面
	printf("%s",s1);//注意s1是被修改的 注意保证s1的空间能装下s2
}

 下面是比较值大小的函数 我想这个是我们应该用的比较多的 因为我们不能直接比较字符串的大小 通常采用 两种方法 一种就是用数组遍历逐位比较 另一种就是采用函数比较 

#include<stdio.h>
#include<string.h>
int main(){
	char s1[50]="abcd";
	char s2[50]="aabcd";
	char s3[50]="bc";
	char s4[50]="abcd";
	int a,b,c;//分别记录值
	//用s1和各个字符串分别比较大小
	a=strcmp(s1,s2);
	b=strcmp(s1,s3);
	c=strcmp(s1,s4);
	printf("a=%d b=%d c=%d",a,b,c);	
}

 我们可以看到当s1<s2(s3) 返回负数  s1>s2返回正数 s1=s2(s4)返回0

接下来是比较简单的一个函数

#include<stdio.h>
#include<string.h>
int main(){
    char s1[50]="abcd1a4s5w6";
    int n=strlen(s1);
    printf("n=%d",n);
}

 使用这个函数我们只需要记住一点就是他不包含末尾的终止符'\0'

接下来我们介绍一个没怎么常用的函数 

真题函数解析 strstr

2021年成信大考题中有涉及到一道题 

 当然这是不知名学长给的答案 笔者不是这样写的

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10
int find(char *s1, char *s2)
{
int n=0,len1=0,len2=0;
len1=strlen(s1);
len2=strlen(s2);
while(len1>=len2)
{
s1=strstr(s1,s2);//扫描字符串 s1,并返回第一次出现 s2 的位置
if(s1!=0){
n++;
s1+=len2;//长串从找到子串的位置开始后移一个子串的长度
}
else break;
len1=strlen(s1);
}
return n;
}
int main(void)
{
int find(char *s1, char *s2);
int count;
char str1[N], str2[N];
char *s1 = str1, *s2 = str2;
printf("请输入字符串 1:\n");
gets(str1);
printf("请输入字符串 2;\n");
gets(str2);
count=find(s1, s2);
printf("%d", count);
system("pause");
return 0;
}

 笔者思路为如下

 这个函数的功能是若s2是s1的子串char *strstr(s1,s2);返回s2在s1中首次出现的地址 如果不是 则返回NULL

#include<stdio.h>//以下函数包含使用头文件

这个库的函数相比大家都很熟悉了 

 对于常见的函数printf、scanf、gets、getc、puts、putchar,我们就不做过多的介绍 

这里主要讲一下在文件下的一些函数使用

下面我们从代码入手

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
	char *p;
	char s[20];
	FILE *fp;
	fp=fopen("2.1.txt","r");//打开文件2.1 类型为txt 打开方式r(只读)
	if(fp==NULL){//打开失败
		printf("File can not be opened\n");
		exit(0);//结束程序
	}
	p=fgets(s,20,fp);//20代表n
	/*函数使用 读入n-1个fp中的字符串个数 存入到s中 遇到换行 文件末尾 
	  或者读满n-1个字符 结束*/
	while(p != NULL){		
		printf("%s",p);//p不是空就输出
		p=fgets(s,20,fp);//继续读入
	}
	fclose(fp);//关闭文件
	return 0;
}

 上面代码介绍了一种读入 字符串读入方式

接下来介绍另一种读入格式化读入

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct a{
	char name[10];
	int age;
	float Mscore;
	float Escore;
	float Yscore;
}stu;
int main(){
	stu b;
	FILE *fp;
	fp=fopen("student.txt","w+");//创建文件 并采用w+(写入)
	if(fp==NULL){
		printf("File can not be opened\n");
		exit(0);
	}
	for(int i=1;i<=5;i++){
		printf("请输入第%d个学生的信息(姓名 年龄 数学 英语 语文)\n",i);
		scanf("%s %d %f %f %f",b.name,&b.age,&b.Mscore,&b.Escore,&b.Yscore);//从终端读入
		fprintf(fp,"%s %d %.2f %.2f %.2f",b.name,b.age,b.Mscore,b.Escore,b.Yscore);
		/*用fprintf把读入的对用数据写入文件 注意是写入*/
		fprintf(fp,"\n");
	}
	rewind(fp);//因为接下来要读入 所以把文件指针拉回开头 当然也可以关闭文件在重新打开
	/*该函数使用一般在需要让文件指针回到最前面时 使用*/
	printf("----------------------------------------------------\n\n");//分行
	for(int i=1;i<=5;i++){
		printf("输出第%d个学生的信息(姓名 年龄 数学 英语 语文)\n",i);
		fscanf(fp,"%s %d %f %f %f",b.name,&b.age,&b.Mscore,&b.Escore,&b.Yscore);
		/*用fscanf 从文件里面把对应的数据读到结构体里面来 注意是从文件读过来*/
		printf("%s %d %.2f %.2f %.2f\n",b.name,b.age,b.Mscore,b.Escore,b.Yscore);
		//输出
	}
	fclose(fp);
	return 0;
}

 

 没有打人名 成绩乱写的 还请见谅

一般来说我们考试就考到以上两种读入即可 当然还有fgets的缩减版 就是fgetc 也就是一个字符一个字符的读入 

原理还是一样的 比如去年的真题

2022真题  

 

 还是比较简单的 以下是笔者的代码段 仅供参考

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
int main(){
	FILE *fp,*fq;
	char s;
	int A,a,num,sum;
	A=a=num=sum=0;
	fp=fopen("1.txt","r");
	fq=fopen("2.txt","w");
	if(fp==NULL){
		printf("no opend\n");
		exit(0);
	}if(fq==NULL){
		printf("no opend\n");
		exit(0);
	}
	s=fgetc(fp);
	while(s!=EOF){
		if(islower(s)){
			a++;
		}else if(isupper(s)){
			A++;
		}else if(isdigit(s)){
			num++;
		}
		if(s=='\n'){
			sum++;
		}
		printf("%c",s);
	s=fgetc(fp);		
	}
	sum++;
	printf("\n大写=%d 小写=%d 数字=%d 行号=%d\n",A,a,num,sum);
	rewind(fp);
	s=fgetc(fp);
	num=0;
	printf("转换后\n");
	while(s){
	if(num==0){
		if(islower(s)){
			s=toupper(s);//小写转大写
			num=1;
		}
	}else if(isupper(s)){
		s=tolower(s);//大写转小写
	}else if(s=='\n'){
		num=0;
	}else if(isdigit(s)||islower(s)){
		
	}else{
		break;
	}
	printf("%c",s);
	putc(s,fq);
	s=fgetc(fp);
	}
	fclose(fp);
	fclose(fq);
	return 0;		
}

当然剩下的还有二进制的fread和fwrite 但是一直没有考过 选择题都没有见过 但是今年也不好说 所以还请大家多多留意复习 我将在随后上传数据结构复习思维导图和数据结构常见代码合集

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值