题目
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。
例如,输入 ”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("%cn", *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
#include
#include
#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("%sn", str2);
system("pause");
return 0;
}