zl程序教程

您现在的位置是:首页 >  其他

当前栏目

从第一字符串中删除第二个字符串中所有的字符。

2023-04-18 14:21:06 时间

题目
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。
例如,输入 ”They are students.” 和 ”aeiou” ,
则删除之后的第一个字符串变成 ”Thy r stdnts.”

思路
str1:They are students.
str2:aeiou
step1:由于ASCII码的所有符号为256个(包括了拓展表),创建一个数组a[256]初始化为0,str2中出现的字符对应为1。a数组将字符的ACALL码作为下标。
str2字符串:“aeiou”,对应的ascii码分别为97,101,105,111,117,将数组a[97],a[101],a[105],a[111],a[117]的值赋值为1,其他为0;
str2[0]就是第一个字符a,当它作为数组下标时,即为字符a的ascall码,即:a[97]=1;
在这里插入图片描述

 for (i = 0; i < strlen(str2); ++i) 
 {
	a[str2[i]] = 1;
	printf("%d", str2[i]); // 97
	printf("%c", str2[i]); // a
}

step2:判断str1中是否包含
定义两个指针,p1 p2
p1指向str1字符串
p2指向str2字符串(存放最终的结果)
以str1中的每个字符的ascall码为数组a 的下标索引,判断所对应的元素是否为1,若为1,则说明,str1中有str2的元素,若为0,则没有。

char *p1 = str1;
while (*p1) {
		printf("%c
", *p1); // T 
		// T ascall码为84,a[84] 是否为0,若为0,则说明T不在str2中出现
		if (a[*p1] == 0) 
		{
		// 将T这个元素给p2
			*p2= *p1;
			p2++; // p2指向下一个位置
		}
		p1++; // 判断str1中第二个元素
	}
	// while循环结束后,说明str1中的元素都已被判断
	// p2中放的最终的结果,最后给字符串结尾。
	*p2 = '';

完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma warning(disable:4996)
int DeletePre(char *str1, char *str2) 
{
	char *p1 = str1;
	char *p2 = str2;
	int a[256] = { 0 };
	for (int i = 0; i < strlen(str2); i++)
	{
		a[str2[i]] = 1;
	}
	while (*p1)
	{
		if (a[*p1]==0)
		{
			*p2 = *p1;
			p2++;
		}
		p1++;
	}
	*p2 = '';
	return str2;
}
int main() 
{
	char str1[] = "They are students.";
	char str2[] = "aeiou";
	DeletePre(str1, str2);
	printf("%s
", str2);
	system("pause");
	return 0;
}