C语言每日一题——第十四天
第十四天
这一次小明想要尝试一下语言分析……当然是最简单的文本匹配。
首先“玩家”会输入长度为10的一串文字,内容全部由大小写字母、数字、空格组成,小明计划用程序匹配出文字中的小写字母abcd
,并按照出现顺序将其保存在数组中,再顺序、逆序打印。
输入
程序通过scanf("%[^\n]", char_array)
获取一串长度为10的文字,且文字全部由大小写字母、数字、空格组成。
输出
打印文字中的小写字母a
、b
、c
、d
,并第一次按字母的出现顺序打印,第二次按与出现顺序相反的顺序打印。
示例
ab and cde
abadcd
dcdaba
解释:ab and cde
是输入字符;第二行abadcd
是打印出的字符,表示输入字符中的小写字母abcd
,其顺序是出现次序;最后一行的dcdaba
与第二行一样,均为输入字符中的abcd
,这次的顺序与出现顺序相反。
import abc
abc
cba
解释:import abc
是输入字符;第二行abc
是打印出的字符,其顺序是出现次序;最后一行的cba
的顺序与出现顺序相反。
1234567890
解释:未出现关键字符,因此第二、三行均为空。
提示
关键
数组的运用
解析
其实这道题我也想让大家了解一下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;
}