使用模块化思想解决复杂函数数组问题

1.请看例题:

【问题描述】分别用字符数组或字符指针做函数参数,在字符串中删除与某字符相同的字符,执行两次删除和结果输出显示。若删除后为空串,则输出NULL。

void Delete1(char s[ ], char ch);  

void Delete2(char *p, char ch);
【样例输入】

abcdabcd

c

d
【样例输出】

abdabd

abab

2.由题干描述,笔者建议使用字符数组作为函数,由于我们在写一个指针的时候需要了解它的指向,类型等诸多问题,因此我们可以节省大把时间。

3.由于第一次删除就有可能判断为空串,所以要使用两个函数,前一个有返回值,并将该值作为第二个函数的执行条件。

4.连续使用scanf输入字符型会导致回车被读走从而影响函数,因此可以编写如下代码以避免此类情况:  while ((b = getchar()) != EOF && b != '\n')
  {
      ;
  }

5.完整代码:

#include
#include
int good(char arr[], char a)
{
    int j = strlen(arr);
    int i = 0;
    int c = 0;
    for (i = 0; i < j; i++)
    {
        if (arr[i] != a)
        {
            arr[c] = arr[i];
            c = c + 1;
        }
    }
    arr[c] = '\0';


    if (strlen(arr) == 0)
    {
        printf("NULL");
        return 9;

    }
    if (strlen(arr) != 0)

    {
        printf("%s", arr);
    }
    printf("\n");
}

void bad(char arr[], char b, char a)
{
    int j = strlen(arr);
    int i = 0;
    int c = 0;
    for (i = 0; i < j; i++)
    {
        if (arr[i] != b && arr[i] != a)
        {
            arr[c] = arr[i];
            c = c + 1;
        }
    }
    arr[c] = '\0';


    if (strlen(arr) == 0)
    {
        printf("NULL");


    }
    if (strlen(arr) != 0)

    {
        printf("%s", arr);
    }
    printf("\n");
}

int main()
{
    char arr[50];
    char arr1[50];
    gets(arr);
    int f = 0;
    f = strlen(arr);
    int g = 0;
    for (g = 0; g <= f; g++)
    {
        arr1[g] = arr[g];
    }

    char a;
    scanf("%c", &a);
    int c;
    c = good(arr, a);
    char  b;
    while ((b = getchar()) != EOF && b != '\n')
    {
        ;
    }
    scanf("%c", &b);


    if (c != 9)
    {
        bad(arr, b, a);
    }

    return 0;
}

你可能感兴趣的:(算法,c语言)