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

void del(char *a, char *b, char *p) {
    for (int i = 0, j; i < strlen(a); i++) {
        if (&a[i] == p) {
            for (j = i + strlen(b); j < strlen(a); j++) {
                a[i] = a[j];
                i++;
            }
            break;
        }
    }
    return;
}

int main() {
    char a[100], b[100];
    char *p = NULL;

    printf("输入字符串 a: ");
    fgets(a, sizeof(a), stdin);
    a[strcspn(a, "\n")] = '\0'; // 去除末尾的换行符

    printf("输入字符串 b: ");
    fgets(b, sizeof(b), stdin);
    b[strcspn(b, "\n")] = '\0'; // 去除末尾的换行符

    while (1) {
        p = strstr(a, b);
        if (p != NULL) {
            del(a, b, p);
        } else {
            break;
        }
    }

    printf("删除后的字符串 a: %s\n", a);
    return 0;
}

代码优化说明:

  1. 使用 fgets() 代替 gets()

    • gets() 函数存在缓冲区溢出的安全风险,容易导致程序崩溃或被恶意攻击。
    • fgets() 函数可以指定读取的字符数,避免缓冲区溢出,提高代码安全性。
  2. 函数参数类型优化:

    • del() 函数的参数类型由数组类型改为指针类型,提高代码的灵活性和可读性。
  3. 处理换行符:

    • fgets() 函数会读取换行符,需要使用 strcspn() 函数去除字符串末尾的换行符,确保输出结果正确。

总结:

通过以上优化,代码更加安全、高效、易于理解和维护。 在实际开发中,应尽量避免使用 gets() 函数,并选择更安全的替代方案,如 fgets() 函数。


原文地址: https://www.cveoy.top/t/topic/mCiE 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录