外部輸入兩個字符串,用C語言編寫實現my_strlen,my_strcpy,my_strncpy,my_strchr,my_strstr函數的功能

#include <stdio.h>
#include <string.h>

// 功能:計算字符串s的長度、返回s的長度,不包括結束符NULL。
void my_strlen(char *str)
{
    int lenth = 0;
    
    while (*str++)
    {
        lenth++;
    }
    
    printf("lenth:\t%d\n",lenth);
    
}

/*比較字符串s1和s2;
(1)當s1<s2時,返回爲負數,注意不是-1;
(2)當s1==s2時,返回值= 0;
(3)當s1>s2時,返回正數,注意不是1。
實際上是比較相應位字符的ASCII碼大小.
如char*s1="abc";char*s2="bd";執行strcmp(s1,s2),其結果是負的.從兩個字符串的頭開始比,因爲字符串s1中的'a'小於s2中的'b'所以s1<s2;
再如:char*s1="abc";char*s2="ad";其結果也是負的,因爲s1中的'b'<s2中的'd'再如:char *s1="abc";char*s2="ab";其結果就是正的.因爲s1中的'c'大於s2中的'\0';因爲字符串的最後一個字符是\0;
再如:char *s1="abc";char *s2="abcd";其結果是負的.因爲s1中的'\0'小於s2中的'd';
*/
int my_strcmp(char *str1,char *str2)
{
    int ret = 0;
    
    while(1)
    {
        ret = *str1 - *str2;
        if(*str1 == '\0' || *str2 == '\0' || ret != 0)
        {
            break;
        }
        
        str1++;
        str2++;
        
    }
    
    return ret;
}

//字符串複製
void my_strcpy(char *str,char *str_cpy)
{
    while(*str)
    {
        *str_cpy++ = *str++;
    }
    
    *str_cpy ='\0';
}

//將指定長度的字符串複製。
void my_strncpy(char *str,char *str_ncpy,int num)
{
    int i = 0;
    int lenth = 0;
    
    lenth = strlen(str);
    
    if(num < lenth)
    {
        for(i = 0;i < num;i++)
        {
            *str_ncpy++ = *str++;
        }
    }
    else
    {
        if(num == lenth)
        {
            for(i = 0;i < num;i++)
        {
            *str_ncpy++ = *str++;
        }
        *str_ncpy++ = '\0';
        }
        else
        {
            while (*str)
            {
                *str_ncpy++ = *str++;
            }
        }
    }
    
    *str_ncpy ='\0';
}

//字符串的拼接,將字符串str2拼接到str1的後面
void my_strcat(char *str1,char *str2)
{
    char *temp = str1;
    
    while(*temp != '\0')
    {
        temp++;
    }
    while(*str2)
    {
        *temp = *str2;
        temp++;
        str2++;
    }
    *temp = '\0';
    
    printf("my_strcat:\t%s\n",str1);
}

//在字符串中查找字符,,打印該字符的地址,沒有則打印NULL!
void my_strchr(char *str,char ch)
{
    while(*str != 0)
    {
        if(ch == *str)
        {
            printf("the adress of the letter:\t%p\n",str);
            break;
        }
        str++;
    }
    if(*str == 0)
    {
        printf("NULL!\n");
    }
}

//在字符串中查找字符串,返回該字符串在字符串中出現的首地址,沒有查找到返回NULL!
char my_strstr(char *str1,char *str2)
{
    char *p = str1;
    char *q = str2;
    
    // if(*str2 == 0)
    // {
        // return printf("NULL!\n");
    // }
    
    if(*str1 == 0 || *str2 == 0)
    {
        return printf("NULL!\n");
    }
    
    while (*str1 && *str2)
    {
        if(*str1 != *str2)
        {
            str2 = q;
            str1 = ++p;
        }
        str1++;
        str2++;
    }
    
    if(*str2 == 0)
    {
        printf("the first adress of the string:\t%p\n",p);
    }
}

int main()
{
    int temp = 0;
    int num = 0;
    
    char ch1 = 0;
    char ch2 = 0;
    
    char str1[100] = {'\0'};
    char str2[100] = {'\0'};
    
    char str_cpy[100] = {'\0'};
    char str_ncpy[100] = {'\0'};
    
    printf("please input first string:\n");
    gets(str1);
    printf("first string:\n%s\n",str1);
    my_strlen(str1);
    my_strcpy(str1,str_cpy);
    printf("str_cpy:\t%s\n",str_cpy);
    printf("please input num:\n");
    scanf("%d",&num);
    getchar();
    my_strncpy(str1,str_ncpy,num);
    printf("str_ncpy:\t%s\n",str_ncpy);
    
    printf("please input second string:\n");
    gets(str2);
    printf("second string:\n%s\n",str2);
    my_strlen(str2);    
    my_strcpy(str2,str_cpy);
    printf("str_cpy:\t%s\n",str_cpy);
    printf("please input num:\n");
    scanf("%d",&num);
    getchar();
    my_strncpy(str2,str_ncpy,num);
    printf("str_ncpy:\t%s\n",str_ncpy);
    
    printf("\n");
    temp = my_strcmp(str1,str2);
    printf("my_strcmp:\t%d\n",temp);
    
    my_strcat(str1,str2);
    
    printf("please input the letter what you need :\t%c\n",ch1);
    scanf("%c",&ch1);
    my_strchr(str1,ch1);
    
    getchar();
    
    printf("please input the letter what you need :\t%c\n",ch2);
    scanf("%c",&ch2);
    my_strchr(str1,ch2);
    
    my_strstr(str1,str2);
    
    return 0;
}

//這個程序只有一個警告,是關於gets函數的,無關緊要。

標題
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章