本题要求实现一个删除字符串中的指定字符的简单函数。
函数接口定义:
void delchar( char *str, char c );
其中
char *str
是传入的字符串,
c
是待删除的字符。函数
delchar
的功能是将字符串
str
中出现的所有
c
字符删除。
裁判测试程序样例:
#include <stdio.h>#define MAXN 20void 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;}/* 你的代码将被嵌在这里 */
输入样例:
ahappy new year
输出样例:
hppy new yer
编写思路:
目标是
删除字符串中的特定字符
,总共需要3个步骤:
-
遍历字符串里的所有字符
从头开始遍历:从字符串的开始一位扫描(代码1)【更常用】
从头开始遍历容易有两个点无法过去,在后边进行说明
从尾开始遍历:从字符串的最后一位扫描(代码2)【更简单】
-
找到符合条件【需要删除】的字符
利用
if
进行判定
-
删除该字符
- 删除字符可以理解成将改字符后边的所有字符向前移动一位
通过代码:
通过代码1:
void delchar( char *str, char c ){for(int i=MAXN-1;i>=0;i--){ //从最后一位开始判定if(str[i]==c){ //如果需要删除for(int j=i;j<MAXN;j++) //将后边移动来覆盖str[j]=str[j+1];}}}
通过代码2:
void delchar(char *str, char c){int i = 0; //定义初始位置(从头开始)while (str[i] != \'\\0\'){ //遍历整个数组if (str[i] == c){ //判断是否满足条件int j = i; //如果满足从当前位置开始while (str[j] != \'\\0\'){ //当前位置之后的所有字符均向前移动一位str[j] = str[j + 1];j++;}i--; //关键【容易漏写】}i++;}}
在最开始尝试这种写法的时候漏写了【关键】地方的
i--
导致有两个点一直无法通过,后来反思需要在此处增加
i--
的原因是:
- 按照顺序扫描,每扫描一次,扫描位置会向后移动一位
- 每次删除字符之后,后续的字符会整体向前移动一位
- 在这一前一后的移动中,容易错位,导致漏掉一些字符的判定
如果从尾部开始扫描则可以规避这个问题