网站建设合同 域名续期,能打开任何网站浏览器下载,园区做网站的好处,养殖公司起名字大全免费初始化字符串
#include string.hvoid *memset(void *s, int c, size_t n);
返回值#xff1a;s指向哪#xff0c;返回的指针就指向哪memset函数把s所指的内存地址开始的n个字节都填充为c的值。通常c的值为0#xff0c;把一块内存区清零。例如定义char buf[10];string.hvoid *memset(void *s, int c, size_t n);
返回值s指向哪返回的指针就指向哪memset函数把s所指的内存地址开始的n个字节都填充为c的值。通常c的值为0把一块内存区清零。例如定义char buf[10];如果它是全局变量或静态变量则自动初始化为0位于.bss段如果它是函数的局部变量则初值不确定可以用memset(buf, 0, 10)清零由malloc分配的内存初值也是不确定的也可以用memset清零。
取字符串长度
#include string.hsize_t strlen(const char *s);
返回值字符串的长度strlen函数返回s所指的字符串的长度。该函数从s所指的第一个字符开始找\0字符一旦找到就返回返回的长度不包括\0字符在内。例如定义char buf[] hello;则strlen(buf)的值是5但要注意如果定义char buf[5] hello;则调用strlen(buf)是危险的会造成数组访问越界。
拷贝字符串
#include string.h
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);void *memcpy(void *dest, const void *src, size_t n);
void *memmove(void *dest, const void *src, size_t n);
返回值dest指向哪返回的指针就指向哪strcpy在拷贝字符串时会把结尾的\0也拷到dest中因此保证了dest中是以\0结尾的字符串。但另外一个要注意的问题是strcpy只知道src字符串的首地址不知道长度它会一直拷贝到\0为止所以dest所指向的内存空间要足够大否则有可能写越界。
strncpy的参数n指定最多从src中拷贝n个字节到dest中换句话说如果拷贝到\0就结束如果拷贝到n个字节还没有碰到\0那么也结束调用者负责提供适当的n值以确保读写不会越界比如让n的值等于dest所指向的内存空间的大小。
memcpy函数从src所指的内存地址拷贝n个字节到dest所指的内存地址和strncpy不同memcpy并不是遇到\0就结束而是一定会拷贝完n个字节。这里的命名规律是以str开头的函数处理以\0结尾的字符串而以mem开头的函数则不关心\0字符或者说这些函数并不把参数当字符串看待因此参数的指针类型是void *而非char *。
memmove也是从src所指的内存地址拷贝n个字节到dest所指的内存地址虽然叫move但其实也是拷贝而非移动。但是和memcpy有一点不同memcpy的两个参数src和dest所指的内存区间如果重叠则无法保证正确拷贝而memmove却可以正确拷贝。假设定义了一个数组char buf[20] hello world\n;如果想把其中的字符串往后移动一个字节变成hhello world\n调用memcpy(buf 1, buf, 13)是无法保证正确拷贝的。
连接字符串
#include string.hchar *strcat(char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t n);
返回值dest指向哪返回的指针就指向哪strcat把src所指的字符串连接到dest所指的字符串后面
比较字符串
#include string.hint memcmp(const void *s1, const void *s2, size_t n);
int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);
返回值负值表示s1小于s20表示s1等于s2正值表示s1大于s2memcmp从前到后逐个比较缓冲区s1和s2的前n个字节不管里面有没有\0如果s1和s2的前n个字节全都一样就返回0如果遇到不一样的字节s1的字节比s2小就返回负值s1的字节比s2大就返回正值。
strcmp把s1和s2当字符串比较在其中一个字符串中遇到\0时结束按照上面的比较准则ABC比abc小ABCD比ABC大123A9比123B2小。
strncmp的比较结束条件是要么在其中一个字符串中遇到\0结束类似于strcmp要么比较完n个字符结束类似于memcmp。例如strncmp(ABCD, ABC, 3)的返回值是0strncmp(ABCD, ABC, 4)的返回值是正值。
搜索字符串
#include string.hchar *strchr(const char *s, int c);
char *strrchr(const char *s, int c);
返回值如果找到字符c返回字符串s中指向字符c的指针如果找不到就返回NULLstrchr在字符串s中从前到后查找字符c找到字符c第一次出现的位置时就返回返回值指向这个位置如果找不到字符c就返回NULL。strrchr和strchr类似但是从右向左找字符c找到字符c第一次出现的位置就返回函数名中间多了一个字母r可以理解为Right-to-left。
#include string.hchar *strstr(const char *haystack, const char *needle);
返回值如果找到子串返回值指向子串的开头如果找不到就返回NULLstrstr在一个长字符串中从前到后找一个子串Substring找到子串第一次出现的位置就返回返回值指向子串的开头如果找不到就返回NULL。这两个参数名很形象在干草堆haystack中找一根针needle按中文的说法叫大海捞针显然haystack是长字符串needle是要找的子串。
分割字符串
#include string.hchar *strtok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim, char **saveptr);
返回值返回指向下一个Token的指针如果没有下一个Token了就返回NULL参数str是待分割的字符串delim是分隔符可以指定一个或多个分隔符strtok遇到其中任何一个分隔符就会分割字符串。
第一次调用要把字符串首地址传给strtok的第一个参数以后每次调用第一个参数只要传NULL就可以了strtok函数自己会记住上次处理到字符串的什么位置显然这是通过strtok函数中的一个静态指针变量记住的。
strtok_r函数则不存在这个问题它的内部没有静态变量调用者需要自己分配一个指针变量来维护字符串中的当前处理位置每次调用时把这个指针变量的地址传给strtok_r的第三个参数告诉strtok_r从哪里开始处理strtok_r返回时再把新的处理位置写回到这个指针变量中这是一个Value-result参数。 char msg[80] 0xb9:0x17//xxxx; //分割 : //char *next, *sub_next;char *token, *sub_token;for (char *str1 msg;; str1 next){token strtok_r(str1, //, next);printf(token%s next%s\n, token, next);if (next NULL)break;if (0 strlen(next))break;for (char *str2 token;; str2 sub_next){sub_token strtok_r(str2, :, sub_next);printf(sub_token%s sub_next%s\n, sub_token, sub_next);if (sub_next NULL)break;if (0 strlen(sub_next))break;}}