H面试程序(25):在一个字符串中删除特定字符

本文介绍了一种使用C语言从字符串中删除特定字符的方法。通过创建一个哈希表记录需要删除的字符,并利用两个指针技巧高效地完成操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

V1.0

#include<stdio.h>
#include<assert.h>
#include<malloc.h>
#include<memory.h>

void Delete_specific_char(char * str1, char * str2)
{
   
   char * phash = (char *)malloc(sizeof(char)*256);
   assert(phash);
   memset(phash, 0, 256);

   int i = 0;
   while(str2[i] != '\0' )
   {
	   phash[str2[i++]] =1;
   }
   
   int newp = 0;
   i = 0;
   while(str1[i] != '\0' )
   {
	   if(phash[str1[i]] ==1)
	   {
		   i++;
	   }
	   str1[newp++] = str1[i];
	   i++;
   }
  str1[newp  ] ='\0';
   


  free(phash);
}

int main()
{   
 char a1[] = "they are student.";  
 char a2[] = "aeiou";
 Delete_specific_char(a1, a2);
 printf("%s",a1);
 printf("%s\n",a2);
 return 0 ;	
}


 

之前的

#include <stdio.h>
#include <malloc.h>
#include <assert.h>
#include <memory.h>

void Delete_specific_char(char * str1, char * str2)
{   
	assert(str1);
	assert(str2);
    char * phash = ( char * )malloc( sizeof(char)*256 );//先将str2在phash中映射一遍
	memset(phash,0,256);
	int i = 0;
	while ( str2[i] != '\0')
	{   
		phash[str2[i]] = 1;
		i++;
	}
	char * fast = str1;  //这个指针用来扫描str1
	char * slow = str1;  //这个指针用来修改str1,存放的是下一个待修改的位置
	int j = 0;
	while (fast[j]!= '\0')  //开始扫描str1
	{   
		if (phash[*fast] != 1)  //如果fast所指向的字母在str2中没有,fast,slow就都指向下一个
		{
             
			 *slow =*fast;
			 fast++;
			 slow++;
		}
		else     //如果fast所指向的字母在str2中存在,那么fast指向下一个
		{     
			 
		      fast++;
			  while (phash[*fast])//继续扫描,把连续的在str2中的字符都跳过,直到找到一个非str2中的字符
			  {
				  fast++;
			  }
			  *slow = *fast;  //将那个非str2的字符赋给slow当前所指向的字符  
			  slow++;   //继续扫描,
			  fast++;
		}
	}
	*slow = '\0';
	free(phash);
}

int main( )
{
   char a1[] = "they are  student. ";
   char a2[] = "aeiouac";

   Delete_specific_char(a1, a2);
   int i = 0;

   while (a1[i] !='\0')
   {
	   printf("%c",a1[i]);
	   i++;
   }
   printf(":\n");
   
   return 0;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值