长度受限的字符串函数:这下函数接受一个显示的长度做参数,用于限定比较或复制的字符数,防止一些长字符串从目标数组中溢出。
三中常见的受限字符串函数:
char * strncpy(char *dst,char const *src,size_t len);
strncpy从src中复制len个字符到dst中,如果strlen(src)的长度小于len,则多出来的字符用NUL填补,注意,当strlen(src)大于或者等于len,strncpy不会以NUL结尾,所以使用strncpy时要慎重考虑。
strncpy功能的实现:
#include<stdio.h> #include<stdlib.h> #include<assert.h> char * my_strncpy(char *dst, char const *src, int len) { assert(dst != NULL); assert(src != NULL); char *p = dst; while (len--) { if (*src != ‘\0‘ ) *p++ = *src++; else *p = ‘\0‘ ; } return dst; } int main() { int len = 0; char arr1[100]; char arr2[100]; scanf( "%s%s%d" , arr1, arr2,&len); char *ret=my_strncpy(arr1, arr2, len); printf( "%s\n" ,ret); system( "pause" ); return 0; }
char * strncat(char *dst,char const *src,size_t len);
同样的,strncat最多将src中的len个字符复制到dst中,并且以NUL结尾,但它不会像strncpy一样用NUL进行填充,而且strncat也不考虑dst数组中剩下的空间是否足够放下len个字符。
strncat功能的实现:
#include<stdio.h> #include<stdlib.h> #include<assert.h> char * my_strncat(char *dst, char const *src, int len) { assert(dst != NULL); char *p = dst; while (*p!= ‘\0‘ ) { p++; } while (len--) { if (*p++= *src++) ; else break ; } if (len==-1) *p = ‘\0‘ ; return dst; } int main() { char arr1[100]; char arr2[100]; int len = 0; scanf( "%s%s%d" , arr1, arr2, &len); char *ret = my_strncat(arr1, arr2, len); printf( "%s\n" , ret); system( "pause" ); return 0; }
int strncmp(char const *dst,char const *src,size_t len);
strncmp与strcmp唯一的区别就是strncmp最多比较len个字符,在返回值方面完全相同。
strncmp功能实现:
#include<stdio.h> #include<stdlib.h> #include<assert.h> int my_strncmp(char const *dst, char const *src, int len) { assert(dst != NULL); assert(src != NULL); while (len) { if (*dst == *src) { if (*src == ‘\0‘ ) return 0; dst++; src++; } else if (*dst > *src) return 1; else return -1; } return 0; } int main() { char arr1[100]; char arr2[100]; int len = 0; scanf( "%s%s%d" , arr1, arr2, &len); int ret = my_strncmp(arr1, arr2, len); if (ret == 1) printf( "arr1[]>arr2[]\n" ); else if (ret == 0) printf( "arr1[]=arr2[]\n" ); else if (ret==-1) printf( "arr1[]<arr2[]\n" ); system( "pause" ); return 0; }
顺便介绍一下strpbrk与strrstr这两个函数:
strpbrk原型:char *strpbrk(char const *dst,char const *group);
功能:查找group中任意一个字符在dst中首次出现的位置,并返回这个地址。
strpbrk功能实现:
#include<stdio.h> #include<stdlib.h> #include<assert.h> char * my_strpbrk(char const *dst, char const *src) { assert(dst != NULL); assert(src != NULL); char *p1 = dst; while (*p1!=‘\0‘ ) { char *p2 = src; while (*p2!=‘\0‘ ) { if (*p1 == *p2) return p1; p2++; } p1++; } return NULL; } int main() { char arr1[100]; char arr2[20]; scanf( "%s%s" , arr1, arr2); char *ret=my_strpbrk(arr1,arr2); printf( "%#p\n" , &*ret); system( "pause" ); return 0; }
参考strrchr这个函数实现一个库中没有的strrstr函数。
功能:strrstr与strstr唯一的区别就是strstr返回的是子字符串首次出现的位置,而strrstr返回的是最后一次出现的地址。
#include<stdio.h> #include<stdlib.h> #include<assert.h> char * my_strrstr(char const *dst, char const *src) { char *last = NULL; assert(dst!=NULL); while (*dst != ‘\0‘ ) { if (*dst == *src) { char *p1=dst+1; char *p2 =src+1; while (*p1==*p2) { if (*p2 == ‘\0‘ ) { last = dst; break ; } p1++; p2++; } if (*p2 == ‘\0‘ ) last= dst; } dst++; } return last; } int main() { char arr1[100]; char arr2[50]; scanf( "%s%s" , arr1, arr2); char *ret=my_strrstr(arr1, arr2); printf( "%#p\n" , &*ret); system( "pause" ); return 0; }