刪除字符串的一部分

《C和指針》第6章編程練習:
請編寫一個函數,刪除一個字符串的一部分,函數的原型如下:
int del_substr(char *str,char const *substr )
函數首先應該判斷substr是否出現在str中,如果它並未出現,函數就返回0;如果出現,函數應該把str 中位於該子串後面的所有字符複製到該子串的位置,從而刪除這個子串,然後函數返回1。如果substr多次出現在str中,函數只刪除第1次出現的子串,函數的第二個參數絕不被修改。
要求:1不能使用任何操縱字符串的庫函數 
     	   2  不能使用下標
後面有源碼及註釋

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

int del_substr(char *str,char const *substr);//函數聲明

int main()
{
    int ret = 0;
    char str[20] ;
    char substr[20] ;
    printf("please input str substr:\n");
    scanf("%s%*c",str);
    scanf("%s",substr);
    printf("str:%s,substr:%s\n",str,substr);
    ret = del_substr(str,substr);
    printf("the change str:%s\n",str);
    printf("%d\n",ret);
    return 0;
}
/*
**完成自己的前count個字符比較函數,相同返回0
*/
int my_strncmp(const char *s1,const char *s2,int count)
{
    const char *c1 = s1;
    const char *c2 = s2;
    while(--count&&(*c1 == *c2))
    {
        c1 ++;
        c2 ++;
    }
    return *c1 - *c2;
}
/*
**完成自己的檢測字符串長度函數,返回字符串長度
*/
int my_strlen(const char *str)
{
    const char *s1 = str;
    for(s1 = str;*s1 != '\0';s1++)
    {
        ;
    }
    return s1 - str;
}
/*
**刪除字符串函數,成功返回1,str中刪除第一個出現的substr;失敗返回0,str不變
*/
int del_substr(char *str,char const *substr)
{
    int flag = 0;//控制只刪除一次的變量
    char *ptr = str;
    char *src = str;
    int len = my_strlen(substr);
    while(*src != '\0')
    {
        if(flag == 0&&my_strncmp(src,substr,len) == 0)
        {
            src = src + len;//匹配成功,src的指向後移len
            flag = 1;
        }
        *ptr++ = *src++;//將src指向的字符賦給ptr指向的字符
    }
    *ptr = '\0';
    str = ptr;//將修改好的字符串賦給str
    if(flag == 1)//如果字符串被改動過一次,返回1
    {
        return 1;
    }
    return 0;
}


發佈了15 篇原創文章 · 獲贊 73 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章