题要求实现一个删除字符串中的指定字符的简单函数。
函数接口定义:
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'
}