📌长度受限制的字符串函数介绍
🍂🍂🍂相信大家发现字符串受限制的函数与不受限制的函数相比多了一个变量num
,这样来说函数相对安全一点,因为有个个数限制
⭐️⭐️5. strncpy
🌿语法:
char * strncpy ( char * destination, const char * source, size_t num )
- 1
🌿用处:把从source
地址开始且含有NULL结束符的字符串复制到以destination
开始的地址空间
🌿注意事项:
拷贝num
个字符从源字符串到目标空间。
如果源字符串的长度小于num
,则拷贝完源字符串之后,在目标的后边追加0,直到num
个。
🌿举例:
/* strncpy example */ #include <stdio.h> #include <string.h> int main () { char str1[]= "To be or not to be"; char str2[40]; char str3[40]; strncpy ( str2, str1, sizeof(str2) ); strncpy ( str3, str2, 5 ); str3[5] = '\0'; /* null character manually added */ puts (str1); puts (str2); puts (str3); return 0; }
🌿🌿输出结果:
To be or not to be To be or not to be To be
🌿实现自己的mystrncpy
char* mystrncpy(char *dest, const char *src, size_t count) { char *tmp = dest; while (count) { if ((*tmp = *src) != 0) src++; tmp++; count--; } return dest; }
⭐️⭐️6. strncat
🌿语法:
char * strncat ( char * destination, const char * source, size_t num )
🌿用处:将一个字符串追加到另一个字符串的结尾处
🌿注意事项:
如果num大于可以追加的字符串个数,那么就只追加到 ' \0 '
就结束
🌿举例:
/* strncat example */ #include <stdio.h> #include <string.h> int main () { char str1[20]; char str2[20]; strcpy (str1,"To be "); strcpy (str2,"or not to be"); strncat (str1, str2, 6); puts (str1); return 0; }
🌿🌿输出结果:
To be or not to be
🌿实现自己的mystrncat
char* mystrncat(char* dest, const char* src, int n) { char* ret = dest; while (*dest != '\0') { dest++; } while (n && (*dest++ = *src++) != '\0') { n--; } dest = '\0'; return ret; } int main() { char dest[20] = "abcedf" ; char src[20] = "ghijk"; char* t = mystrncat(dest, src,3); printf("%s", t); return 0; } //🌿🌿🌿运行结果:abcedfghi
⭐️⭐️7. strncmp
🌿语法:
int strncmp ( const char * str1, const char * str2, size_t num );
🌿用处:比较两个字符串的大小
🌿注意事项:
🌿🌿比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
从第一个字符开始进行比较,若相同则比较下一个字符:
若第一个字符串大于第二个字符串,则返回大于0的数字
若第一个字符串等于第二个字符串,则返回0
若第一个字符串小于第二个字符串,则返回小于0的数字
🌿举例:
/* strncmp example */ #include <stdio.h> #include <string.h> int main () { char str[][5] = { "R2D2" , "C3PO" , "R2A6" }; int n; puts ("Looking for R2 astromech droids..."); for (n=0 ; n<3 ; n++) if (strncmp (str[n],"R2xx",2) == 0) { printf ("found %s\n",str[n]); } return 0; }
🌿🌿输出结果:
Looking for R2 astromech droids... found R2D2 found R2A6
🌿实现自己的mystrncmp
int mystrncmp(const char* str1, const char* str2,int num) { char* ret = str1; while ( *str1 == *str2 && num>0) { if (*str2 == '\0') *ret = '\0'; str1++; str2++; num--; } return ret; }
📌字符串查找
⭐️⭐️8. strstr
🌿语法:
char * strstr ( const char *str2, const char * str1);
🌿用处:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
🌿注意事项:
🌿🌿比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
从第一个字符开始进行比较,若相同则比较下一个字符:
1.若第一个字符串大于第二个字符串,则返回大于0的数字
2.若第一个字符串等于第二个字符串,则返回0
3.若第一个字符串小于第二个字符串,则返回小于0的数字
🌿举例:
/* strstr example */ #include <stdio.h> #include <string.h> int main () { char str[] ="This is a simple string"; char * pch; pch = strstr (str,"simple"); if (pch != NULL) strncpy (pch,"sample",6); puts (str); return 0; }
🌿🌿输出结果:
This is a sample string
🌿实现自己的mystrstr
char* mystrstr(const char* str1, const char* str2) { char* s1; char* s2; char* cp = str1; if ( *str2 == '\0') return str1; while (*cp) { s1 = cp; s2 = str2; while (*s1 != '\0' && *s2!= '\0' && * s1 == *s2) { s1++; s2++; } if (*s2 == '\0') { return cp; } cp++; } return NULL; } int main() { char str1[] = { "helloworld" }; char str2[] = { "world" }; char* t = mystrstr(str1 , str2); printf("%s", t); return 0; }
⭐️⭐️9. strtok
🌿语法:
char * strtok ( char * str, const char * delimiters )
🌿用处:
作用于字符串str,以delimiters中的字符为分界符,将str切分成一个个子串;如果,str为空值NULL,则函数保存的指针SAVE_PTR在下一次调用中将作为起始位置。
返回值:分隔符匹配到的第一个子串
🌿注意事项:
1、函数的作用是分解字符串,所谓分解,即没有生成新串,只是在s所指向的内容首次出现分界符的位置,将分界符修改成了’/0’,故第一次用strtok返回第一个子串
2、第一次提取子串完毕之后,继续对源字符串str进行提取,应在其后(第二次,第三次…第n次)的调用中将strtok的第一个参数赋为空值NULL(表示函数继续从上一次调用隐式保存的位置,继续分解字符串;对于前一次次调用来说,第一次调用结束前用一个this指针指向了分界符的下一位)
3、当this指针指向“\0” 时,即没有被分割的子串了,此时则返回NULL
4、可以把delimiters理解为分隔符的集合,delimiters中的字符均可以作为分隔符。
5、strtok在调用的时候,如果起始位置即为分隔符,则忽略了起始位置开始的分隔符
6、strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
🌿举例:
/* strtok example */ #include <stdio.h> #include <string.h> int main () { char str[] ="- This, a sample string."; char * pch; pch = strtok (str," ,.-"); while (pch != NULL) { printf ("%s\n",pch); pch = strtok (NULL, " ,.-");//这里填 NULL即可,因为函数会记住之前已经查找完的字符的下一个起始位置 } return 0; }
🌿🌿输出结果:
This a sample string