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

int erase_once(char *input_string, const char *substring, int case_sensitive) {
    size_t string_length = strlen(input_string);
    size_t substring_length = strlen(substring);

    if (string_length < substring_length || substring_length == 0) return 0;

    size_t i;
    for (i = 0; i < string_length - substring_length + 1; i++) {
        int match_found = 1;

        for (size_t j = i; j < i + substring_length; j++) {
            if ((case_sensitive == 0 &&
                 tolower(input_string[j]) != tolower(substring[j-i])) ||
                input_string[j] != substring[j-i]) {
                match_found = 0;
                break;
            }
        }

        if (!match_found) continue;

        for (; i < string_length - substring_length; i++) {
            input_string[i] = input_string[i + substring_length];
        }
        input_string[i] = '\0';

        return 1;
    }

    return 0;
}

int erase(char *input_string, const char *substring, int case_sensitive) {
    int count;
    for (count = 0; erase_once(input_string, substring, case_sensitive); count++);
    return count;
}

int main(void) {
    char main_string[] = "abcdef cde AbCDE";
    const char *substring_to_erase = "abc";

    erase(main_string, substring_to_erase, 0);
    printf("%s\n", main_string);

    return 0;
}

我try 通过将变量INT CASE_SENSITIVE设置为区分大小写;当变量为0时,它不区分大小写;当变量为1时,它区分大小写,例如: 对于输入"ABCDEF CDE ABCDE"和子字符串"ABC",如果为1,则应返回 -"def CDE ABCDE"; 对于相同的输入,并且将区分大小写设置为0 它应该返回"def CDE DE" 另一个例子是字符串 XYXyXYXY和子字符串xy,并且敏感设置为0,它应该返回 空字符串

但是没有,你能帮我找出错误吗?

推荐答案

把任务分成几个小块

int strneq(const char *s1, const char *s2, size_t n, int cs)
{
    char c1 = 0, c2 = 0;
    while(n-- && *s1 && *s2)
    {
        if(cs)
        {
            c1 = *s1;
            c2 = *s2;
        }
        else
        {
            c1 = tolower(*s1);
            c2 = tolower(*s2);
        }
        if(c1 != c2) break;
        s1++;
        s2++;
    }
    return !(c1 == c2);
}

char *mystrstr(const char *s, const char *find, int cs)
{
    size_t slen = strlen(s);
    size_t flen = strlen(find);
    char *result = NULL;
    if(slen >= flen)
    for(size_t index = 0; index <= slen - flen; index++)
    {
        if(!strneq(s + index, find, slen - index  + 1, cs))
        {
            result = (char *)(s + index);
            break;
        }
    }
    return result;
}

char *strrem(char *haystack, const char *needle, int cs)
{
    size_t nlen = strlen(needle);
    size_t hlen = strlen(haystack);
    char *current;
    while((current = mystrstr(haystack, needle, cs)))
    {
        while((*current = *(current + nlen))) current++;
    }
    return haystack;
}

int main(void)
{
    char h[] = "abcdef cde AbCDE";
    char *n = "abc";

    printf("'%s'\n", strrem(h,n,0));
}

https://godbolt.org/z/M7bh8Pq7a

C++相关问答推荐

gcc已编译的可执行文件TSB是否同时暗示最低有效字节和最低有效位?

segfault在C中使用getline()函数

需要大整数和浮点数.使用long long int和long double

在函数中使用复合文字来初始化C语言中的变量

C:fopen是如何实现二进制模式和文本模式的?

如何使用低级C++写出数值

如何调试LD_PRELOAD库中的构造函数?

Win32API Wizzard97 PropSheet_SetWizButton不工作

预先分配虚拟地址空间的区域

从uint8_t*转换为char*可接受

无法在OpenGL上绘制三角形

通过描述符查找文件路径时出现问题

按长度对argv中的单词进行排序

将回调/基于事件的C API转换为非回调API

通过k&;r语法的c声明无效

在吉陀罗中,_2_1_和CONCAT11是什么意思?

如何使用calloc和snprintf

如何在MSVC中使用intSafe.h函数?

未使用sem_open正确初始化信号量

如何用用户输入的多个字符串填充数组?