习题8-6 删除字符 (20 分)

本题要求实现一个删除字符串中的指定字符的简单函数。

函数接口定义:

void delchar( char *str, char c );

其中char *str是传入的字符串,c是待删除的字符。函数delchar的功能是将字符串str中出现的所有c字符删除。

裁判测试程序样例:

#include <stdio.h>
#define MAXN 20

void delchar( char *str, char c );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */

int main()
{
    
    
    char str[MAXN], c;

    scanf("%c\n", &c);
    ReadString(str);
    delchar(str, c);
    printf("%s\n", str);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

a
happy new year

输出样例:

hppy new yer

题解:

/*方法一*/
void delchar( char *str, char c )
{
    
    
	int s; //循环变量 
	int flag; //判断点 
	
    /*思路:找到要删除的字符,就在该位然后后面的字符往前移一位*/
	for ( ; *str != '\0' ; str++)
	{
    
    
		if (*str == c) //找到要删除的字符
		{
    
    
			for (s = 1 ; *str != '\0' ; s++ , str++) //后面一位往前面移,同时统计指针str移动了几位
			{
    
    
				*str = *(str + 1);
				flag = 1; //如果有移动过,判断点变成1
			}
		}

		if (flag) //如果有移动过
		{
    
     
			str = str - s; //这边str减去s使得str回复到外循环的str去,注意这里的s需要减一,因为循环末尾外循环str会加加,所以上面for循环的s赋值为1
			flag = 0; //判断点赋值为0,为下次做准备
		}
		
	}

}
/*方法二*/
// void delchar( char *str, char c )
// {
    
    
// 	char *p = str; //定义指针p,让其指向str,也就是指向主程序的str数组,所以现在p指针的改变,主程序的str数组也会改变
	
//     /*思路:遍历,只要不等于要删除字符的字符都赋值给p指针*/
// 	for ( ; *str != '\0' ; str++)
// 	{
    
    
// 		if ( *str != c)
// 		{
    
    
// 			*p = *str; //赋值
// 			p++; //p指针加加,使其指向下一位
// 		}
// 	} 

// 	*p = *str; //由于字符串结尾有\0,for循环当中到\0就结束了,所以循环结束后,需要把\0赋值到p指针里面
    
// }
/*方法三:把要删除字符外的所有字符赋值到一个新数组里面,然后新数组在赋值给旧数组*/
// void delchar( char *str, char c )
// {
    
    
// 	char a [MAXN]; //定义新数组,注意范围需要用宏变量,以防出错
// 	int i; //循环变量
// 	int j = 0; //数组b下标变量
	
//     /*循环遍历str数组,找出除要删除字符外的字符,赋值给新数组*/
// 	for (i = 0; str [i] != '\0' ; i++)
// 	{
    
    
// 		if (str [i] != c) a [j++] = str [i];
// 	}
// 	a [j] = '\0'; //循环结束后新数组末尾要加字符串结束标识
	
//     /*把新字符串赋值给旧字符串*/
// 	for (i = 0; a [i] != '\0' ; i++)
// 	{
    
    
// 		str [i] = a[i];
// 	}
// 	str [i] = '\0'; //同样末尾需要加字符串结束标识
	
// }

/*方法四:利用两个下标变量,赋值覆盖*/
// void delchar( char *str, char c )
// {
    
    
// 	int i; //循环变量
// 	int j = 0; //新数组下标变量
	
// 	for (i = 0; str [i] != '\0' ; i++)
// 	{
    
    
// 		if (str [i] != c) str [j++] = str [i]; //不等于要删除的字符就赋值给前面的字符
// 	}
// 	str [j] = '\0'; //遍历完在新下标哪一位赋值上字符串结束标识\0 这样后面的数就屏蔽了
	
// }

猜你喜欢

转载自blog.csdn.net/qq_44715943/article/details/115152133
今日推荐