本题要求实现一个删除字符串中的指定字符的简单函数。
函数接口定义:
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 这样后面的数就屏蔽了
// }