文章目录

  • 题目
  • 一、裁判测试程序样例:
  • 输入样例
  • 输出样例
  • 二、学习思路与代码实现
  • 1.思路
  • 2.代码实现

题目

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

一、裁判测试程序样例:

#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

二、学习思路与代码实现

1.思路

(1)首先创建一个字符数组和一个字符分别存储字符串和我们所要删除的指定字符。
(2)输入我们要删除的字符和字符串(这里要注意

(3)我们在裁判测试程序样例中可以看到,最后打印的还是str,即源字符串首元素地址,所以我们要在源字符串上完成删除指定字符。

(4)知道指针和数组的关系,str[i]是指下标为i的元素,*str=str[0]

(5)主要用i和j来实现,str[i]表示未删除指定字符的源字符串,str[j]表示删除指定字符后的字符串,注意这里的虽然用了i,j,但是依然是在同一个地址空间完成删除的,str[i]从首元素开始依次判断,如果不是我们要删除字符,就赋给str[j],直到str[i]指向’\0’,最后再把’\0’赋给str[j],作为字符串结束的标志
(6)注意这个函数的返回值为空

2.代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#define MAXN 20
void delchar(char* str, char c)
{
	int i=0;//str[i]表示原来的字符串
	int j=0;//str[j]表示删除指定字符后的字符串
	while (str[i] != '\0')
	{
		//刚开始指针指向原字符串的首元素地址
		//当指针所指向的字符不是我们要删除的字符串时
		//才能让str的空间地址,或者说str所指向的字符等于对应的字符
		if (str[i] != c)
		{
			str[j++] = str[i];//str[j++]也是一直往后走的
		}
		//str[i]依次判断是否为要删除的指定字符,不是就赋给str[j]
		i++;
	}
	//最后一步,将'\0'赋上
	str[j] = str[i];
}
int main()
{
	char str[MAXN], c;
	scanf("%c", &c);
	//读取缓冲区的'\n'
	getchar();
	//之前谈过scanf读入字符串时,遇到空格或'\n'会直接结束
	//所以字符串的读取最好用gets()
	gets(str);
	//删除指定字符的函数
	delchar(str, c);
	//str是删除指定字符后的字符串的首元素地址
	printf("%s\n", str);

	return 0;
}