【蓝桥杯算法题】字符串匹配算法

6 篇文章 0 订阅

题目:用C语言写一个程序,输入一个字符串,过滤此串,只保留字符串中的字母字符,并统计新生成的字符串中包含的字母个数,要求用指针实现。

实现:

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

int filterLetters(char *str);

int main() {
    char str[100];
    printf("请输入一个字符串: ");
    fgets(str, 100, stdin); // 获取用户输入的字符串
    int letters_count = filterLetters(str); // 调用函数过滤字母字符并统计个数
    printf("过滤后的结果为: %s\n", str);
    printf("过滤后的字符串中包含 %d 个字母\n", letters_count);
    return 0;
}

int filterLetters(char *str) {
    char *p1 = str, *p2 = str;
    int count = 0;
    while (*p2 != '\0') {
        if (isalpha(*p2)) { // 判断字符是否为字母
            *p1++ = *p2; // 指针 p1 和 p2 分别指向相同的字母字符
            count++; // 统计字母个数
        }
        p2++; // p2 每次移动指向下一个字符
    }
    *p1 = '\0'; // 将 p1 所在的位置赋值为 NULL,结束字符串
    return count;
}

解释1:

这段代码实现了一个过滤字符串中非字母字符的功能,并统计字母个数。

  • 首先,在主函数中,定义一个长度为100的字符数组str,用fgets函数从标准输入获取用户输入的字符串。
  • 然后调用filterLetters函数,利用指针p1和p2遍历字符串中的每个字符,判断是否为字母字符,
  • 若是,则将其赋值给p1所指向的位置,并让p1指向下一个位置,同时统计字母个数count;
  • 若不是,则直接跳过该字符,继续向后遍历。最后,在filterLetters函数中,将p1所在的位置赋值为NULL,结束字符串,并返回字母个数count。
  • 需要注意的是,isalpha函数是ctype.h头文件中的一个函数,用来判断字符是否为字母,如果是则返回非零值(true),否则返回0(false)。此外,在使用fgets函数时,需要注意输入字符串的长度不要超过数组str的长度,否则会导致数组越界的问题。

解释2:

这段代码的功能是从用户输入的字符串中过滤出字母字符,并统计字母字符的个数,最后输出过滤后的结果和字母字符的个数。

  • 具体来说,代码中首先包含了两个头文件:stdio.h 和 ctype.h。stdio.h 包含了一些标准输入输出函数,而 ctype.h
    包含了一些字符处理函数,例如判断一个字符是否为字母字符。
  • 在 main 函数中,首先定义了一个 char 类型的数组 str,用于存储用户输入的字符串。然后通过 fgets 函数从标准输入流
    stdin 中获取用户输入的字符串,最多读取 100 个字符,将其存储在 str 数组中。
  • 接着调用 filterLetters函数对字符串进行过滤,该函数的作用是将字符串中的字母字符保留下来,并且将它们移动到数组的前面,非字母字符则被忽略掉。该函数返回被保留下来的字母字符的个数。
  • 在 filterLetters 函数中,首先定义两个指针 p1 和 p2,分别指向字符串的开头。然后使用一个 while循环遍历整个字符串,如果当前字符是字母字符,则将其移动到 p1 所指向的位置,并将 p1 后移一位,同时统计字母字符的个数count。如果当前字符不是字母字符,则直接将 p2 后移一位。
  • 最后,在字符串的末尾加上一个 NULL 字符,以表示字符串的结束。在 main 函数中,输出过滤后的结果和字母字符的个数即可。

总之,这段代码实现了一个简单的字符串处理功能,能够对用户输入的字符串进行一定的过滤和统计。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SmallFatMan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值