c语言:字符串和内存函数介绍-1
https://developer.aliyun.com/article/1515640
9、strtok
- strtok 函数定义
char * strtok ( char * str, const char * sep );
- sep所指向的字符串,定义了在str中当作分割符的字符集合,strtok函数通过sep找到str中的分隔符,将其标记并改为
'\0',然后返回这个标记的指针。(strtok函数会改变str所指向的字符串,所以参数一般都是目标字符串的临时拷贝)
- strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串 中的位置
- strtok函数第一参数若为空指针,函数将在同一个字符串中被保存的位置开始,查找下一个分隔符并标记返回该标记所指向的下一个元素的指针。
- 举例:
#include<stdio.h> #include<string.h> int main() { char arr[] = { "xx?abc{ddf+ll" }; char* p = arr; char sep[] = { "?{+" }; char*ret=strtok(p, sep); printf("%s\n", ret); ret = strtok(NULL, sep); printf("%s\n", ret); ret = strtok(NULL, sep); printf("%s\n", ret); return 0; }
10、strerror
- 返回错误码,所对应的错误信息(必须包含头文件string.h,stdio.h,与errno.h)
- strerror函数定义为
errnum为错误码,不同的错误码对应着不同的错误信息;当错误信息生成的时候就会被保存在errnum当中,识别errnum当中的错误码信息就可以查找解决对应的问题。
char * strerror ( int errnum );
- 演示:
#include<errno.h> #include<string.h> #include<stdio.h> int main() { printf("%s\n",strerror(0)); printf("%s\n",strerror(1)); printf("%s\n",strerror(2)); printf("%s\n",strerror(3)); printf("%s\n",strerror(4)); return 0; }
11、常见字符分类函数(islower,isupper,isdigit等)
举例,就拿isdigit函数来说,此类函数包含于头文件ctype.h中;当判断为是数字字符时,isdigit函数返回非0的数字,当判断为非数字字符的时候,返回数字0;
#include<stdio.h> #include<ctype.h> int main() { char ch = 'a'; int flag = isdigit(ch); if (flag) printf("YES\n"); else printf("NO\n"); //打印结果为NO; return 0; }
一些其他的分类函数(表格);返回值和类型与上述相当;
isdigit | 判断是否为0~9的十进制数字 |
isxdigit | 判断是否为十六进制(包含十进制和大小写字母) |
islower | 判断是否为小写字母 |
isupper | 判断是否为大写字母 |
isalpha | 判断是否为大小写字母 |
isalnum | 判断是否为字母或者数字 |
ispunct | 判断是否为标点符号已经任何数字或字母的图形字符 |
isgraph | 判断是否为任何图形字符 |
isprint | 判断是否为任何可打印字符(包括图形和空白字符) |
12、字符转换函数(tolower以及toupper)
- 函数定义为:
1. int tolower ( int c ); 2. int toupper ( int c );
- 使用:(此处将返回值改为大写,并未转变原字符串)
#include <stdio.h> #include <ctype.h> int main () { int i=0; char str[]="abcdef ABCDEF.\n"; char c; while (str[i]) { c=str[i]; if (isupper(c)) c=tolower(c); putchar (c); i++; } return 0; }
13、memcpy函数(memmove,memcpy的重叠用法)
- 函数定义为:
void * memcpy ( void * destination, const void * source, size_t num );
- 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
- 这个函数在遇到 '\0' 的时候并不会停下来。
- 如果source和destination有任何的重叠,复制的结果都是未定义的。
- 举例:(其他类型的数据同样如此)
#include<stdio.h> #include<string.h> int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int brr[10] = {0}; memcpy(brr, arr, 20); //这里将arr的前五个元素拷贝到brr中; for (int i = 0;i < 10;i++) printf("%d ", brr[i]); return 0; }
- 模拟实现memcpy(同时也是memmove的实现):
#include<stdio.h> void* my_memcpy(void *dest, void *str, size_t n) { void* ret = dest; if (dest < str) { while (n--) { *(char*)dest = *(char*)str; dest = (char*)dest + 1; str = (char*)str + 1; } } else { while (n--) { *((char*)dest + n) = *((char*)str + n); } } return ret; } int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int brr[5] = { 0 }; my_memcpy(arr+2, arr, 20); for (int i = 0;i < 10;i++) { printf("%d ", arr[i]); } return 0; }
14、memcmp
- memcmp函数定义 :
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
- 类似于strcmp,这里num来控制两个字符串比较的长度(单位字节),返回值类似于strcmp。
str1 ? str2 | 返回值 |
> | >0 |
< | <0 |
= | =0 |
举例:
#include<stdio.h> #include<string.h> int main() { int str1[] = { 1,2,3,4,5,6,7 }; int str2[] = { 1,2,3,4,7,6,6 }; int ret= memcmp(str1, str2,20 ); if (ret > 0) printf("str1>str2\n"); else if (ret < 0) printf("str1<str2\n"); else printf("str1=str2\n"); return 0; } //运行结果为 str1 < str2