实验8-2-3 删除字符 (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

函数ReadString:

void ReadString( char s[] )
{
	gets(s);
}

思路: 可以类似重写一个mycpy函数(翁恺老师课里面那样) 

方法一: 用指针, 指向同一个地址, 然后用strcpy的思想对其进行填充

 void delchar( char *str, char c ) 
 {
     char *p = str; //指向同一个地址, 所以修改*p的值, 也便相当于修改*str
     while(*str) { // 当str字符串指向最后一个位置的时候, *str = '\0' 即 0
         if(*str!=c) { //反方向思考, 要删除, 则就是保留不是c的其他字符
             *p = *str; // 不是c时, 把该位置的str复制进字符数组p中
             p++; //并对p进行自增操作
             //上面两句也可以合成一句 *p++ = *str
         }
         str++; //也可以把这句自增放在while的条件判断中:while(*str++)
     }
     //不能使用do-while循环 省去了在循环后再 *p = *str 填充最后的'\0'的步骤
     //在某些极限的边界情况下会出现错误
     *p = *str;
 }

方法二: 只用一个指针, 不用创建第二个, 而是创建了一个不同的下标用于进行值的覆盖操作, 最后用'\0'截断 

void delchar( char *str, char c )
{
    int i, j=0; //j一定要赋初始值为0, 作为后面运算 (?相当于左值吧)的下标
    //循环中i一直在增加, 而j只在条件满足的情况下增加, 所以j增加得较慢, 给j位置赋值可以覆盖原先i位置的值
    for(i=0; *(str+i)!='\0'; i++) { //当str还没达到尾部的时候
        if(*(str+i) != c) { //如果这个位置不是字符c
            *(str+(j++)) = *(str+i); //把这个字符复制给自己
        }
    }
    *(str+j) = '\0'; //给最后一位塞个'\0'
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值