C语言----字符函数和字符串函数(3)https://developer.aliyun.com/article/1544419
11.strtok函数的使用
charstrtok(charstr,const char *sep)
1.sep参数指向一个字符串,定义了用作分隔符的字符集合
2.第一个参数指定了一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记
3.strtok函数找到str中的下一个标记,并将用\0结尾,返回一个指向这个标记的指针。(注意:strtok会改变被操作符的字符串,所以被strtok函数切分的字符串一般都是临时拷贝的内容并且可以修改)
4.strtok函数的第一个参数不为NULL,函数将找到str中的第一个标记,就是第一个分隔符,strtok函数将保存他在字符串中的位置
5.strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置,查找下一个标记。
6.如果字符串中不存在更多的标记,则返回NULL指针,就是说明这个字符串已经被找完了,再没有任何的分隔符了,已经尽数转化为\0了
//int main() //{ // char arr[] = "abdjskgb@vsfkv.net"; // char buf[256] = { 0 }; // strcpy(buf, arr);//把arr数据拷贝到buf内//abdjskgb\0vsfkv\0net // char sep[] = "@.";//char*sep= "@." // char* ret=strtok(buf, sep); // printf("%s\n", ret);//输出结果就是abdjskgb // // char* ret1 = strtok(NULL, sep); // printf("%s\n", ret1);//输出结果就是vsfkv // // // char* ret2 = strtok(NULL, sep); // printf("%s\n", ret2);//输出结果是net // // // return 0; //} //strtok的返回值是buf的第一个标记的指针 //当这个函数返回的是一个空指针的时候,就说明这个函数已经找完了 //上面这种写法必然是错误的,我们必须先知道提供的字符串需要切割几段 int main() { char arr[] = "abdjskgb@vsfkv.net"; char buf[256] = { 0 }; strcpy(buf, arr);//把arr数据拷贝到buf内//abdjskgb\0vsfkv\0net char *sep = "@.";//分割符 char* ret = NULL; //上个代码的buf只在strtok里面进行一次,后面都是空指针 //我们利用了for循环的特点,初始化只执行一次 //就是说只有第一次传的是buf,后面传的都是NULL for (ret = strtok(buf, sep); ret != NULL;ret=strtok(NULL,sep)) { printf("%s\n", ret); } //只要ret不等于NULL这个循环就一直执行 //strtok(buf, sep)的返回值是第一个切割符前面的字符串的地址,并将其赋值给ret, //每次循环都会运行ret=strtok(NULL,sep),将新获得的返回值赋值给ret,然后每次循环就从新位置开始 return 0; } //总结:我们定义一个数组arr,里面带有分隔符 // 再定义一个空数组,将带有分隔符的数组拷贝过来,在后面的过程,我们都是用这个拷贝的数组 // // char* ret = NULL;:定义了一个指向分割后子字符串的指针。 //char *sep = "@."; 定义了分隔符字符串,包含 @ 和 .。 /*针对这个循环进行更加详细的解释 ret = strtok(buf, sep)是初始化部分, 在循环开始之前,strtok被调用,使用buf和sep来分割字符串,并返回第一个子字符串的指针 这个指针被赋值给ret,作为循环的起始点 循环条件:ret != NULL 这表示只要strtok返回的指针不是NULL,就能继续执行循环体, 因为strtok在没有更多子字符串可供分割时会返回NULL,所以在没有更多子字符串可供分割时会结束 迭代部分:ret = strtok(NULL, sep) 在每次循环迭代时,strtok(NULL, sep)被调用,告知strtok继续从上一次的位置继续分割字符串 并返回下一个子字符串的指针,这个指针被赋值给ret,作为下一次循环的起始点 这个循环的条件保证了每次循环迭代都能够正确地从输入字符串中分割出一个子字符串, 并且在没有更多子字符串可供分割时结束循环。 */ //strtok可以把一个字符串切成一段一段的,每切一次就将起始地址返回去 //每次就直接将分隔符前面的字符串切割下来,并将切割符变为\0,就是\0后面的字符将不进行访问 //函数会找到第一个分隔符,并记住位置,下次找就从这个位置开始找
12.strerror函数的使用
strerror可以将错误对应的错误信息字符的地址返回
strerror 函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明的,C语⾔程序启动的时候就会使⽤⼀个全局的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会将对应的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。
//int main() //{ // for (int i = 0; i < 10; i++) // { // printf("%d:%s\n", i,strerror(i)); // } // return 0; //} //0:No error //1:Operation not permitted //2 : No such file or directory //3 : No such process //4 : Interrupted function call //5 : Input / output error //6 : No such device or address //7 : Arg list too long //8 : Exec format error //9 : Bad file descriptor int main() { //打开文件 FILE*pf=fopen("date.txt", "r");//r---读,以读文件的形式打开文件,如果文件不存在就是打开失败 //打开失败就返回一个空指针 if (pf == NULL)//打开失败 { printf("打开文件失败,原因是%s",strerror(errno));//为了使用errno我们要包含头文件#include <errno.h> return 1;//打开失败我们就直接结束进程 } else { printf("打开成功\n"); fclose(pf);//关闭文件 pf = NULL; } return 0; } //打开文件失败,原因是No such file or directory
strerror---将错误码对应的错误信息的字符串的起始地址返回
int main() { //打开文件 FILE*pf=fopen("date.txt", "r");//r---读,以读文件的形式打开文件,如果文件不存在就是打开失败 //打开失败就返回一个空指针 if (pf == NULL)//打开失败 { printf("打开文件失败,原因是:%s\n",strerror(errno));//为了使用errno我们要包含头文件#include <errno.h> perror("打开文件失败,原因是"); return 1;//打开失败我们就直接结束进程 } else { printf("打开成功
perror--将errno中错误信息直接打印出来
perror函数线打印str指向的字符串,再打印冒号,再打印空格,再打印错误码对应的信息
atoi函数的使用与模拟实现
什么是atoi函数
atoi函数是将字符串转换为整数
基本格式
int atoi (const char * str)
返回值是int
参数:str是要转换为整数的字符串
函数atoi使用细节
1.当参数位置传入的为NULL指针时会报错,当参数位置传入的为空字符串时,返回值为0;
2.atoi函数会自动过滤开始时的空白字符;
3.atoi函数会根据字符串内容自动判断整数的正负;
4.当字符串的数字大小超过了整型数字的取值范围时,返回时会变为整型数据的最大或最小值;
5.当字符串中的数字有非10进制字符隔断时,atoi函数会直接返回当前位置前面的数字;
//int main() //{ // int ret = atoi("123"); // printf("%d ", ret);//输出值就是123 // return 0; //} //1.参数是NULL的话,那么这个程序就会报错的 //int main() //{ // char str[] = "241";//创建字符数组 // int ret = atoi(NULL);//如果参数是NILL的话,那么就会报错的 // printf("%d", ret); // // return 0; //} //2.如果参数是一个空字符串的话,那么就是返回的是0 //int main() //{ // char str[] = ""; // int ret = atoi(str); // printf("%d", ret); // // return 0; //} //3.atoi函数会自动过滤参数里面的空字符的 //int main() //{ // char str[] = " -54321"; // int ret = atoi(str); // printf("%d", ret); // // return 0; //} //4.字符串的数字大小超过了整型数字的取值范围时,返回时会变为整型数据的最大或最小值 //int main() //{ // char str[] = "238947283649234";//这个字符串内的数字过于大,那么返回值就是c语言规范中的最大值 // int ret = atoi(str); // printf("%d", ret); // // return 0; //} //5.当字符串中的数字有非10进制字符隔断时,atoi函数会直接返回当前位置前面的数字 //int main() //{ // char str[] = "-543abc21";//参数中间被abc隔开,那么这个函数就会选取前面的数字 // int ret = atoi(str); // printf("%d", ret); // // return 0; //}