常用头文件的函数

21 篇文章 2 订阅

1 printf sscanf

1.printf()  //其是一个函数,也存在调用关系等  
int x=printf("a=%d b=%d \n",a,b);//其底层调动的是fprintf(stdout,"a=%d b=%d \n",a,b);
//即此时不像文件写入,而是向标准输出设备写入


char str[]={"yhpinghello"}printf("%s\n",str);
printf(str);//打印str,只是少了回车
printf("yhp\n");//一样的

sscanf("12 34",%d %d,&a,&b)//从字符串里获取数据
//解决的问题
char * str="123.34.45.56"sscanf(str,%d.%d,&a,&b)//a=123  b=34;

cout<<b<<c //也是函数,需要压参
//cout 20  ---> push 20

const char *p="/htmp http1.0";
	char q[10] = {0};
	char s[10] = { 0 };
	char e[10] = { 0 };
	sscanf(p,"%s %s",q,s,e);
sscanf本身就有以空格作为一次结束

2 assert

assert(条件判断) //<assert.h>
//断言函数,在DEBUG编译后的obj文件中加入调试信息,release被忽略。如果条件判断不满足则打印导致不满足条件的原因和行数,返回值为空(void)

3.itoa atoi 由C++ boost库的lei_cast 替代


itoa(int value,char *string,int base) //广泛使用的非标准C语言和C++语言扩展功能,因此不能好好的被所有编译器使用
//<cstdlib>  将整型的数字变量转换为字符数组变量,一般用于进制的转换。在<cstdlib>中与之有相反功能的函数atoi
//int value 被转换的整数,char *string 转换后储存的字符数组,int base 转换的进制数,如2,8,10,16 进制等,大小应在2-36之间。
char str[20];
itoa(12,str,2);//将12 转换为字符串表示的2进制  (只适用于整形)

atoi

const char *p = "12\n34";
int a = atoi(p);//a=12 
//函数会扫描参数 nptr字符串,会跳过前面的空白字符(例如空格,tab缩进)等。如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回 0

4.sprintf fprintf

sprintf由stringstream和boost库的format替代

sprintf(char *string, char *format [,argument,...]);
//主要功能是把格式化的数据写入某个字符串中,即发送格式化输出到 string 所指向的字符串。sprintf 是个变参函数。使用sprintf 对于写入buffer的字符数是没有限制的,这就存在了buffer溢出的可能性。解决这个问题,可以考虑使用 snprintf函数,该函数可对写入字符数做出限制

char str[20]={};//其20个空间被初始化为0;
int a=10,b=20;
sprintf(str,"a=%d b=%d\n",a,b);  //将字符串"a=10 b=20\n"写入str字符串内

5 typeinfo

查看变量名的类型名,以字符串的方式输出。(sizeof 编译时计算变量名类型的大小)

#inlude<typeinfo>
	int a=10;
	const int *b=&a;//const int * ( 即const会参与类型)
	int * const c=&a; //int * ( 即const 需要修饰右边带*的,不然编译器在编译时会将const消除)
	int & d=a;//int (&不参与类型组成)
	const int &e=10;//int (即在函数重载时需注意,const和&被消除)  当作为常量和非常量时
	int f[10]={};// int [10];
	cout << typeid(a).name() << endl;
	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;
	cout << typeid(d).name() << endl;
	cout << typeid(e).name() << endl; 
	cout << typeid(f).name() << endl;void fun(int &x)
{

}

void fun(const int &x)
{

}
可以实现,此时const会被保留

6 strtok 其分割后由静态变量接管 多线程不安全

char *p=strtok(buff," ");//用一个数据将切割的状态记录下来,该状态数据是共享的,可被NULL所共享! 
//下次调用形式
printf("fun:: %s\n",p);//传NULL的原因:让strtok接着使用上一次的状态继续切割
//下次在调用strtok需要使用上一次保存的状态,则该状态已经跳出了函数的生命期成为共享数据(内部使用了static),即对于线程是不安全的


strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串中包含的所有字符。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针。

strtok函数会破坏被分解字符串的完整,调用前和调用后的s已经不一样了。如果要保持原字符串的完整,可以使用strchr和sscanf的组合等。

int main()
{
	char buff[1024];
	strcpy(buff, "111/222");
	//第一次strtok只是将该数组切割,p指向切割数组的起始
	char *p = strtok(buff, "/");//111\0222\0 其是一个字符数组,当修改其中的值时会发生覆盖
	p = strtok(NULL, "/");//第二次完成,p才被设置指向了分割的第四个字符
	char ps[12];
	strcpy(ps, "222");
	strcat(buff, "/");//当你改变buff时,即buff 111/\022\0 ,此时p指向了\0
	strcat(buff,p+1);
	
	return 0;
}

7.初始化填充函数(将first指向的空间,填充n个x值)(对象到空间)

在这里插入图片描述

const int n = 10;
	int ar[n];//0 1 2 3 4 5--> VAL 12  // 5 6 7 8 9 // 23
	//uninitialized_fill_n(ar, 5, 12); //5个元素 到达ar+4
	//uninitialized_fill_n(ar + 5, 5, 23);// 算头部算尾
	uninitialized_fill_n(uninitialized_fill_n(ar, 5, 12) , 5, 23);//利用返回值

8.初始化拷贝函数(对象到空间)

将范围[first,last)中元素的副本构造到从result开始的范围,并返回目标范围中最后一个元素的迭代器
在这里插入图片描述

9.拷贝函数(对象到对象)

在这里插入图片描述

10 填充函数(对象到对象,已经有对象了)

在这里插入图片描述

11 向后拷贝

向后复制元素范围,将范围(first,last)中从结尾开始的元素复制到result终止的范围中。函数返回目标范围中第一个元素的迭代器。
在这里插入图片描述

	int ar[8] = { 1,2,3,4,5,6 };
	copy_backward(ar, ar + 5, ar + 6);//总体右移 0下标可修改

12 逆向拷贝(使得逆序)

在这里插入图片描述

ps:末尾迭代器指向末尾的下一个元素,所谓算头不算尾,指针是指向该元素

13 memset()

#include<string.h>
void *memset(void *s,int ch,size_t n);//memset函数按字节对内存块进行初始化
//将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
//作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法
//还可以接受二级指针,虽然memset参数类型为void * 但可以接受,且在函数内部void *p转换为(char *)p刚好能处理一级空间

memset是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。(与填充有点类似,但填充是针对容器对象的)

14.strchr strrchr

  • strchr 寻找某个字符首次出现的位置
  • 但是对于string管理的字符串来说,其已经不是很好了,find函数重载能实现很多字符查找
char *strchr(const char *str, int c);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值