C 代码在字符串中删除不区分大小写的子字符串时出现问题

问题描述 投票:0回答:1
#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;
}

我尝试通过将变量 int case_sensitive 使其区分大小写;当该变量为 0 时,它不敏感;当它为 1 时,它区分大小写,例如: 对于输入“abcdef cde AbCDE”和子字符串“abc”,如果它是 1,则应返回 -“def cde AbCDE”; 对于相同的输入和区分大小写设置为 0 它应该返回“def cde DE” 另一个例子是字符串 xYXyXYXY 和子字符串 xy 和敏感设置为 0 它应该返回 空字符串

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

arrays c string substring case-sensitive
1个回答
0
投票

您只是忘记检查 case_sensitive==1 ,否则始终会检查并考虑“if 条件”的后半部分。 这是您需要编辑的行

if ((case_sensitive == 0 &&
                 tolower(input_string[j]) != tolower(substring[j-i])) ||
                (case_sensitive == 1 &&
                input_string[j] != substring[j-i]))

注意:你的解决方案太复杂了,而且你的代码不够干净,这些技巧将帮助你识别任何问题并让你轻松调试

© www.soinside.com 2019 - 2024. All rights reserved.