AI智能
改变未来

【PTA习题总结与反思】6-6 删除字符 (20分)【程序设计基于C#】

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

函数接口定义:

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. 遍历字符串里的所有字符

    从头开始遍历:从字符串的开始一位扫描(代码1)【更常用】

    从头开始遍历容易有两个点无法过去,在后边进行说明

    从尾开始遍历:从字符串的最后一位扫描(代码2)【更简单】

  2. 找到符合条件【需要删除】的字符

    利用

    if

    进行判定

  3. 删除该字符

      删除字符可以理解成将改字符后边的所有字符向前移动一位

通过代码:

通过代码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--

的原因是:

  1. 按照顺序扫描,每扫描一次,扫描位置会向后移动一位
  2. 每次删除字符之后,后续的字符会整体向前移动一位
  3. 在这一前一后的移动中,容易错位,导致漏掉一些字符的判定

如果从尾部开始扫描则可以规避这个问题

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 【PTA习题总结与反思】6-6 删除字符 (20分)【程序设计基于C#】