C语言每日一题——第十四天

第十四天

这一次小明想要尝试一下语言分析……当然是最简单的文本匹配。

首先“玩家”会输入长度为10的一串文字,内容全部由大小写字母、数字、空格组成,小明计划用程序匹配出文字中的小写字母abcd,并按照出现顺序将其保存在数组中,再顺序、逆序打印。

输入

程序通过scanf("%[^\n]", char_array)获取一串长度为10的文字,且文字全部由大小写字母、数字、空格组成。

输出

打印文字中的小写字母abcd,并第一次按字母的出现顺序打印,第二次按与出现顺序相反的顺序打印。

示例

ab and cde
abadcd
dcdaba

解释ab and cde是输入字符;第二行abadcd是打印出的字符,表示输入字符中的小写字母abcd,其顺序是出现次序;最后一行的dcdaba与第二行一样,均为输入字符中的abcd,这次的顺序与出现顺序相反。

import abc
abc
cba

解释import abc是输入字符;第二行abc是打印出的字符,其顺序是出现次序;最后一行的cba的顺序与出现顺序相反。

1234567890


解释:未出现关键字符,因此第二、三行均为空。

提示

C语言获取包含空格的文本方式

关键

数组的运用


解析

其实这道题我也想让大家了解一下string.h ,但其实不用也无所谓,所以只在解析代码用到了。

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


int main() {
    char string[11];  // 众所周知,长度为10的字符串占用空间为11(有结束符\0)
    int target_char_numbers = 0;

    scanf("%[^\n]", string);

    for (int i = 0; i < 10; i++) {
        // 判断 string[i] 是否是关键字符串, 如果是,将会把该字符移动到上一个关键字符的后面
        if (string[i] <= 'd' and string[i] >= 'a') {
            // 匹配到了关键字符

            // 判断是否(真的)要复制关键字符
            if (target_char_numbers != i) {
                string[target_char_numbers] = string[i];
            }
            // 关键字符数量加一
            target_char_numbers += 1;
        }
    }

    // 因为我使用之前获取输入的字符串保存关键字符,只是将这些关键字符拷贝到了前面,因此还需要将没有被关键字符覆盖的空间填充为0
    memset(&string[target_char_numbers], 0, sizeof(string) - target_char_numbers);

    // 顺序打印
    printf("%s\n", string);
    // 逆序打印
    for (int i = target_char_numbers-1; i >= 0; i--) {
        printf("%c", string[i]);
    }
    printf("\n");
    
    return 0;
}
posted @ 2022-10-11 12:04  风吹云动  阅读(128)  评论(0编辑  收藏  举报