快临近考试了,这里在带领大家复习一遍常用的函数库函数,考场上可以直接调用省去一大堆的推演代码时间
目录
首先是字符处理函数
因为这个我们平时使用最少但是考试最容易涉及
#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 但是一直没有考过 选择题都没有见过 但是今年也不好说 所以还请大家多多留意复习 我将在随后上传数据结构复习思维导图和数据结构常见代码合集