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);