不受限字符串函數功能的實現

一、字符串長度函數原型:數組

size_t strlen(char const *string);ide

strlen()計算的長度不包括'\0'。函數

strlen返回的值是一個無符號的整型,因此像if(strlen(x)-strlen(y)>=0)的結果是絕對爲真的,將達不到你想要的結果。spa

計算字符串長度的實現:指針

#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;
}

二、字符串複製函數原型:內存

char *strcpy(char *dst,char const *src);字符串

strcpy()函數是將參數src字符串中的字符複製到參數dst中,當參數dst和參數src內存出現重疊時,其結果是未定義的。原型

注意:string

一、strcpy()碰見'\0'才停下,因此當參數src字符串長度大於參數dst字符串時,多餘的字符會將參數dst字符串後面的內存空間覆蓋掉,這時很是危險的。it

二、當src中字符串比dst中的短時,因爲strcpy()會將src中的'\0',複製過去,因此新字符串後面的老字符串會被刪除掉。

char arr[]="hello world";

strcpy(arr,welcome);

w e l c o m e 0 r l
               
d 0


如表,新字符串碰見'\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;
}

三、字符串鏈接函數原型:

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;
}

 

四、字符串比較函數原型:


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;
}


五、查找一個字符函數原型:

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;
}

六、查找一個字符串是不是另外一個字符串的子串原型:

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;
}
相關文章
相關標籤/搜索