C语言书上可能没有提到的好用的函数~~~

一. 字符串函数

1. 字符串查找函数

#include

函数原型: 

char *strchr(const char*s , int c);

作用:

在字符指针s指向的字符串中,找ascii码为c的字符 只匹配第一个  

找到返回字符的地址 找不到返回NULL 

函数原型:

char *strrchr(const char *s,int c);

最后一次出现  返回 末次匹配地址 

2.字符串匹配函数

#include

函数原型:

char *strstr(const char *haystack,const char *needle);

作用:

 haystack指向的字符串中查找到needle指向的字符串 首次匹配

找到返回地址,没有返回NULL

3.字符串转换数值 

#include

函数原型: 

int atoi(const char *nptr);

long atol(const char*nptr);

double atof(const char*nptr);

作用:

将nptr指向的字符串转换成整数 返回 

4.字符串切割函数 

#include 

函数原型:

char *strtok(char *str,const char* delim);

作用:

按照delim指向的字符串中的字符,切割str指向的字符串

就是在star指向的字符串中发现delim字符串的字符 然后将其变成'\0'

调用strtok只切割一次,切割一次后,

再去切割的时候 strtok的第一个参数传NULL,意思是接着上次切割的位置继续切 

注意 如果star字符串中出现了连续的几个delim中的字符,则只将第一个字符变成'\0'

#include

void test_strtok(){
	char s[] = "asd:fwr:tgfas:rgrgert:ded";
	char *ret;
	ret = strtok(s,":");
	printf("%s\n",ret);
	
	while((ret = strtok(NULL,":"))!=NULL){
		printf("%s\n",ret);
	}
}

5. 格式化字符串操作函数

函数原型:

int sprintf(char *buf,const char *format,---);

作用:

输出到buf指定的内存区域

将按照格式保存的字符串复制给str 返回保存的字符串的字节数 

int sscanf(const char*buf,const char *format,---) ;

作用:

从第一个参数中读取数据  返回成功的个数 

#include

void test_springf_sscanf(){
	char buf[20];
	sprintf(buf,"%d:%d:%d",2023,10,1);
	printf("%s\n",buf);
	int a,b,c;
	sscanf("2023:10:1","%d:%d:%d",&a,&b,&c);
	printf("%d %d %d\n",a,b,c);
}

sscanf();函数的高级使用方式  (正则)

(1)跳过数据: %*s %*d

(2)读指定宽度的数据: %[width]s

(3)支持集合操作: 只支持获取字符串

%[a-z] 匹配a到z中任意字符(尽可能多的匹配) 

%[aBc] 匹配 a B c中一员, 贪婪性

%[^aFc] 匹配 非 a F c的任意字符 贪婪性

%[^a-z] 表示读取除 a-z以外的所有字符 

#include

void test_sscanf(){
	char buf1[20];
	sscanf("1234 5678","%*d %s",buf1); 
	printf("%s\n",buf1);
	char buf2[20];
	sscanf("123456789","%4s",buf2);
	printf("%s\n",buf2);
	char buf3[20];
	sscanf("hfjadfhudfhiFGJHOS","%[a-z]",buf3); 
	printf("%s\n",buf3);
}

二: const 

1.修饰普遍变量代表只读的意思

const int a = 100;

以后的程序中,不能再赋值给a,但是可以通过变量的地址修改

int *p = &a;

*p = 888;

2.修饰指针

如果const修饰指针变量的类型,无法通过指针变量修改地址里面的值 

const int *p = &c;

如果const修饰指针变量,无法修改指针变量保存的地址

int  * const p= &c;

如果const 既修饰指针变量的类型,又修饰指针变量,则只能通过原本的变量修改值 

const  int  * const p= &c;  都不行哦 

void test4(){
	int c=100;
	//const int *p = &c;  可以修改这个验证 const的作用哦
	int *p = &c;
	printf("*p = %d\n",*p);
	c=666;
	printf("*p = %d\n",*p);
	*p=777;
	printf("*p = %d\n",*p);
	int d = 888;
	printf("*p = %d\n",*p);
	p=&d;
	printf("*p = %d\n",*p);
}

三.相同类型的结构体变量可以相互赋值 

struct stu{
	int id;
	char name[20];
	char sex;
	int age;
}; 
void test5(){
	struct stu chas;
	chas.id = 121921;
	chas.age=18;
	strcpy(chas.name,"chas");
	chas.sex='1';
	struct stu jiji; 
	jiji =  chas;
 	// 可以printf();看看结果哦
}

四.文件

fread()

函数原型:

size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream);

作用:

从 stream 所表示的文件中读取数据,一块是size字节 共 nmemb块 存放到ptr指向的内存里

返回 实际读到的块数

int num = fread (str,100,3,fp); 

fwrite()

函数原型:

size_t fwrite(void *ptr, size_t size,size_t nmemb,FILE *stream);

作用:

将ptr指向的内存里的数据,向stream所表示的文件中写入数据,一块是size个字节,共nmemb块

返回 实际写入的块数 

你可能感兴趣的:(C语言,c语言,c++,开发语言,单片机,嵌入式硬件)