坑爹的不受限字符串函数

来源:互联网 发布:java 毫秒和秒的换算 编辑:程序博客网 时间:2024/06/06 11:47

1、字符串长度函数原型:

size_t strlen(char const *string);

strlen()计算的长度不包括'\0'。

strlen返回的值是一个无符号的整型,所以像if(strlen(x)-strlen(y)>=0)的结果是绝对为真的,将达不到你想要的结果。

计算字符串长度的实现:

#include<stdio.h>#include<stdlib.h>int my_strlen(char *p){                 int count = 0;                 while(*p != '\0')                 {                         count++;                         p++;                 }                 return count;}int main(){                 char arr[100];                 scanf( "%s", arr);                 int  ret = my_strlen(arr);                 printf( "%d\n", ret);                 system( "pause");                 return 0;}


2、字符串复制函数原型:

char *strcpy(char *dst,char const *src);

strcpy()函数是将参数src字符串中的字符复制到参数dst中,当参数dst和参数src内存出现重叠时,其结果是未定义的。

注意:

1、strcpy()遇见'\0'才停下,所以当参数src字符串长度大于参数dst字符串时,多余的字符会将参数dst字符串后面的内存空间覆盖掉,这时非常危险的。

2、当src中字符串比dst中的短时,由于strcpy()会将src中的'\0',复制过去,所以新字符串后面的老字符串会被删除掉。

char arr[]="hello world";

strcpy(arr,welcome);

welcome0rl

               

d0


如表,新字符串遇见'\0'停下,后面的字符就相当于被删除了。

字符串复制“功能”的实现:

#include<stdio.h>#include<stdlib.h>void my_strcpy(char *p1, char *p2){                 while (*p2 != '\0')                {                                * p1 = *p2 ;                                 p1++;                                 p2++;                }                * p1 = '\0' ;}int main(){                 char arr1[100];                 char arr2[50];                 scanf( "%s", arr1);                 scanf( "%s", arr2);                 my_strcpy(arr1, arr2);                 printf( "%s\n", arr1);                 system( "pause");                 return 0;}

3、字符串连接函数原型:

char *strcat(char *dst,char *src);

strcat()函数是将src中的字符串连接在dst中的字符串后面,如果src与dst位置发生重叠,其结果也是未定义的。

注意:在使用strcat()函数时,必须要考虑dst数组中除过原字符串之后剩下的空间能否容纳下src。

字符串连接“功能”的实现:

#include<stdio.h>#include<stdlib.h>void my_strcat(char *p1, char *p2){                 while (*p1 )                {                                 p1++;                }                 while (*p2 )                {                                * p1 = *p2 ;                                 p1++;                                 p2++;                }                * p1 = '\0' ;}int main(){                 char arr1[100];                 char arr2[50];                scanf( "%s%s", arr1, arr2);                my_strcat(arr1, arr2);                printf( "%s\n", arr1);                system( "pause");                 return 0;}

 

4、字符串比较函数原型:


int strcmp(char const *s1,char const *s2);


字符串比较的是ASCII的值,对两个字符串中的字符逐个比较,发现第一个不匹配的字符,如果s1中的ASCII大于s2中的,则返回一个大于零的数,如果小于,则返回一个小于零的数。如果s1中字符串比s2中短,则返回一个小于零的数。

如果一直匹配,直到‘\0’,两个字符串就相等,则返回0。

字符串比较“功能”的实现:

#include<stdio.h>#include<stdlib.h>int my_strcmp(char *p1, char *p2){       if (*p1 == *p2)       {            while (*p1 == *p2)            {                if (*p2 == '\0')                   return 0;                 p1++;                 p2++;             }            if (*p1 > *p2)                return 1;            else                return -1;      }}int main(){     char arr1[100];     char arr2[100];     scanf( "%s%s", arr1, arr2);     int ret = my_strcmp(arr1,arr2);     printf( "%d\n", ret);     system( "pause");     return 0;}


5、查找一个字符函数原型:

char *strchr(char const *str,int ch);

char *strrchr(char const *str,int ch);

strchr()是查找第一次出现的位置,strrchr()是查找最后一次出现的位置。如果找到就返回一个指向这个位置的指针,如果没找到就返回NULL。

查找一个字符第一次出现“功能”的实现:

#include<stdio.h>#include<stdlib.h>char *my_strchr(char *p, char chr){       while (*p )      {            if (*p == chr)               return p ;             p++;      }      return NULL ;}int main(){     char arr[100];     char chr;     printf( "输入被查找使我字符\n" );     scanf( "%c", &chr);     printf( "输入查找的字符串\n" );     scanf( "%s",arr);     char *ret=my_strchr(arr, chr);     printf( "%s\n", ret);     system( "pause");     return 0;}

“查找一个字符最后一次出现”功能的实现:

#include<stdio.h>#include<stdlib.h>char *my_strrchr(char *p, char chr){   char *p2 = NULL ;   while (*p )     {          if (*p == chr)           p2 = p;          p++;     }   return p2;}int main(){    char arr[100];    char chr;    printf( "输入被查找的字符\n" );    scanf( "%c", &chr);    printf( "输入查找的字符串\n" );    scanf( "%s", arr);    char *ret = my_strrchr(arr, chr);    printf( "%s\n", ret);    system( "pause");    return 0;}

6、查找一个字符串是否是另一个字符串的子串原型:

char *strstr(char const *s1,char const *s2);

这个函数在s1中查找整个s2在s1第一次出现的位置,如果找到 则返回这个地址,如果没有找到,则返回NULL,如果s2为空字符串,则返回s1。

查找一个字串“功能”的实现:

#include<stdio.h>#include<stdlib.h>char *my_strstr(char *p1, char *p2){     if (*p2 == NULL)         return p1 ;     while (*p1 )     {        if (*p1 == *p2)        {             char *p3 = p1 ;             char *p4 = p2 ;             while (*p3 == *p4)             {                 if (*p4 == '\0' )                   return p1 ;                  p3++;                  p4++;              }             if (*p4 == '\0' )                return p1 ;        }        p1++;     }    return NULL ;}int main(){    char arr1[100];    char arr2[100];    scanf( "%s%s", arr1, arr2);    int  ret = my_strstr(arr1, arr2);    printf( "%d\n", ret);    system( "pause");    return 0;}

不受限的字符串函数使遇到‘\0’才结束的,所以一定不要忘了'\0'.
1 0
原创粉丝点击