📌错误信息报告
⭐️⭐️10.strerror
🌿语法:
char * strerror ( int errnum )
🌿用处:
strerror()用来依参数errnum 的错误代码来查询其错误原因的描述字符串, 然后将该字符串指针返回
🌿注意事项:
在程序代码中包含 #include <errno.h>,然后每次程序调用失败的时候,系统会自动用用错误代码填充errno这个全局变量,只需要读errno这个全局变量就可以获得失败原因了。
🌿🌿每个错误码都有对应的错误信息:
🌿🌿🌿如下打印0,1,2,3的错误码:
int main() { printf("%s\n", strerror(0)); printf("%s\n", strerror(1)); printf("%s\n", strerror(2)); printf("%s\n", strerror(3)); return 0; }
🌿🌿🌿结果分别如下显示:
No error Operation not permitted No such file or directory No such process
🌿举例:
/* strerror example : error list */ #include <stdio.h> #include <string.h> #include <errno.h> int main () { FILE * pFile; pFile = fopen ("unexist.ent","r"); if (pFile == NULL) printf ("%s\n",strerror(errno)); return 0; }
🌿🌿输出结果:
No such file or directory
📌内存操作函数
⭐️⭐️11. memcpy
🌿语法:
void * memcpy ( void * destination, const void * source, size_t num )
🌿用处:
以source指向的地址为起点,将连续的num个字节数据,复制到以 destination指向的地址为起点的内存中。函数有三个参数,第一个是目标地址,第二个是源地址,第三个是数据长度
返回值:分隔符匹配到的第一个子串
🌿注意事项:
1.函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
2.这个函数在遇到 ‘\0’ 的时候并不会停下来。
3.如果source和destination有任何的重叠,复制的结果都是错误的,此时就要用到另一个库函数memmove。
🌿举例:
int main() { int a[10] = { 1,2,3,4,5,6,7,8,9 }; int b[20] = { 0 }; memcpy(b, a, 40); //这里的40相当于10*sizeof(int) for (int i = 0; i < 20; i++) { printf("%d ", b[i]); } return 0; }
🌿🌿输出结果:
1 2 3 4 5 6 7 8 9 0 0 0 0 0 0 0 0 0 0 0
🌿实现自己的memcpy
void* mymemcpy(void* dest, const void* src, size_t count) { void* ret = dest; while (count--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } return ret; } int main() { int a[10] = { 1,2,3,4,5,6,7,8,9 }; int b[20] = { 0 }; mymemcpy(b, a, 40); for (int i = 0; i < 20; i++) { printf("%d ", b[i]); } return 0; }
⭐️⭐️12. memmove
🌿语法:
void * memmove ( void * destination, const void * source, size_t num )
🌿用处:
当使用memcpy时,存在内存重叠问题时可能会出错(比如把自身字符串后面一截复制到前面一截),memmove解决了此问题,解决问题的方法是当出现内存重叠时,从后往前开始拷贝
🌿注意事项:
memmove和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
如果源空间和目标空间出现重叠,就得使用memmove函数处理。
🌿举例:
/* memmove example */ #include <stdio.h> #include <string.h> int main () { char str[] = "memmove can be very useful......"; memmove (str+20,str+15,11); puts (str); return 0; }
🌿🌿输出结果:
void* mymemmove(void* dest, const void* src, size_t count) { void* ret = dest; if (dest < src) { while (count--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } } else { while (count--) { *((char*)dest + count) = *((char*)src + count); } } return ret; } int main() { int a[10] = { 1,2,3,4,5,6,7,8,9 }; mymemmove(a+2, a, 16); for (int i = 0; i < 10; i++) { printf("%d ", a[i]); } return 0; }
⭐️⭐️13. memset
🌿语法:
void *memset(void *s, int ch, size_t n);
🌿用处:
将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。
🌿注意事项:
- memset() 函数常用于内存空间初始化。
- memset()的深刻内涵: 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化
例如:memset(a,’\0’,sizeof(a));
- memset可以方便的清空一个结构类型的变量或数组。
#include<string.h>
需要引用头文件
🌿举例:
/* memset example */ #include <stdio.h> #include <string.h> int main () { char str[] = "almost every programmer should know memset!"; memset (str,'-',6); puts (str); return 0; }
🌿🌿输出结果:
------ every programmer should know memset!
⭐️⭐️14. memcmp
🌿语法:
int memcmp(const void *buf1, const void *buf2, unsigned int count);
🌿用处:
当buf1<buf2时,返回值<0
当buf1=buf2时,返回值=0
当buf1>buf2时,返回值>0
🌿注意事项:
该函数是按字节比较的。
🌿🌿🌿例如:
s1,s2为字符串时候memcmp(s1,s2,1)就是比较s1和s2的第一个字节的ascII码值;
memcmp(s1,s2,n)就是比较s1和s2的前n个字节的ascII码值;
char *s1="abc"; char *s2="acd"; int r=memcmp(s1,s2,3);
就是比较s1和s2的前3个字节,第一个字节相等,第二个字节比较中大小已经确定,不必继续比较第三字节了所以r=-1.
对于memcmp(),如果两个字符串相同而且count大于字符串长度的话,memcmp不会在\0处停下来,会继续比较\0后面的内存单元.
如果想使用memcmp比较字符串,要保证count不能超过最短字符串的长度,否则结果有可能是错误的。
🌿举例:
/* memcmp example */ #include <stdio.h> #include <string.h> int main () { char buffer1[] = "DWgaOtP12df0"; char buffer2[] = "DWGAOTP12DF0"; int n; n=memcmp ( buffer1, buffer2, sizeof(buffer1) ); if (n>0) printf ("'%s' is greater than '%s'.\n",buffer1,buffer2); else if (n<0) printf ("'%s' is less than '%s'.\n",buffer1,buffer2); else printf ("'%s' is the same as '%s'.\n",buffer1,buffer2); re
🌿🌿输出结果:
'DWgaOtP12df0' is greater than 'DWGAOTP12DF0'.