A. 实验9_8_设计函数 void delcharfun(char *str,char ch)

C语言字符串处理
本文介绍了一个C语言函数,用于从字符串中删除特定字符,并详细解释了函数的工作原理和潜在的错误,通过示例展示了如何正确实现该功能。

设计函数 void delcharfun(char *str,char ch)实现从字符串str中删除指定的字符ch。同一字母的大、小写按不同字符处理。
输入与输出要求:
输入一个长度不超过100的非空字符串与一个字符,代表需要处理的字符串与需要从字符串中删除的字符。其中字符串中不会出现空格、换行符。输出删除指定字符以后的字符串,占一行。如果删除指定字符后字符串变为空串,则直接输出空行。

隐蔽的错误

#include<stdio.h>
#include<string.h>
void delcharfun(char *str,char ch);
int main()
{
	int i;
	char str[101],ch;
	scanf("%s",str);
	getchar();
	scanf("%c",&ch);
	delcharfun(str,ch);
	printf("%s",str);
	return 0;
}
void delcharfun(char *str,char ch)
{
	for(int i=0;i<strlen(str);i++)
	{
		if(*(str+i)==ch)
		{
			for(int j=i;j<strlen(str);j++)
			{
				*(str+j)=*(str+j+1);
			} 
		}
	}
}

PS(当题目不过时,一定是程序的某一处有问题,这时候不要想当然,即使题目给的例子对了,也要结合例子的特点再想反例,)

艰难的改正

#include<stdio.h>
#include<string.h>
void delcharfun(char *str,char ch);
int main()
{
	int i;
	char str[101],ch;
	scanf("%s",str);
	getchar();
	scanf("%c",&ch);
	delcharfun(str,ch);
	printf("%s",str);
	return 0;
}
void delcharfun(char *str,char ch)
{
	for(int i=0;i<strlen(str);)
	{
		if(*(str+i)==ch)
		{
			for(int j=i;j<strlen(str);j++)
			{
				*(str+j)=*(str+j+1);
			} 
		}
		else
		{
			i++;
		}
	}
}

<think>好的,用户需要编写一个C语言函数void fun(char *str, char ch),用来删除字符串中所有出现的指定字符ch。首先,我得回忆一下字符串处理的基本方法。C语言中的字符串是以字符数组的形式存储的,以&#39;\0&#39;结尾。所以,处理时需要遍历每个字符,将不需要删除字符保留下来。 首先,考虑函数参数。用户给出的函数原型是void fun(char *str, char ch),其中str是原始字符串ch是要删除字符函数需要原地修改字符串,不需要返回新字符串,而是直接在原字符串上进行操作。 接下来,如何实现删除操作。通常的做法是使用两个指针:一个用于遍历原字符串(源指针),另一个用于指向当前需要保留的位置(目标指针)。当源指针指向的字符不等于ch时,就将该字符复制到目标指针的位置,然后两个指针都递增。如果等于ch,则只移动源指针,目标指针不动。这样遍历完成后,目标指针的位置就是新字符串的结尾,需要添加&#39;\0&#39;终止符。 举个例子,假设字符串是"hello",要删除字符&#39;l&#39;。源指针会依次检查每个字符:h不是l,复制到目标位置;e同样保留;第一个l被跳过;第二个l也被跳过;o保留。最后得到的结果是"heo",并在末尾加上&#39;\0&#39;。 需要注意的是,大小写敏感的问题。用户提到同一字母的大、小写按不同处理,比如要删除的是大写的&#39;A&#39;,那么小写的&#39;a&#39;不受影响。所以在比较时,直接使用char的相等判断即可,无需转换大小写。 另外,需要处理空字符串的情况吗?如果输入的str是空字符串,或者长度为0,函数应该直接返回。但C语言中的字符串以&#39;\0&#39;结尾,所以即使str为空,循环也会立即结束,不会有问题。 现在,编写代码的大致步骤: 1. 判断输入指针是否有效,虽然题目可能假设str有效,但实际应用中可能需要检查是否为NULL。 2. 初始化两个指针,比如src和dst,都指向str的开头。 3. 遍历字符串,直到遇到&#39;\0&#39;。 4. 在遍历过程中,如果*src != ch,就将*src赋值给*dst,并递增dst指针。 5. 无论是否赋值,src指针都递增。 6. 遍历结束后,在dst的位置添加&#39;\0&#39;。 代码示例: void fun(char *str, char ch) { char *src = str; char *dst = str; while (*src) { if (*src != ch) { *dst++ = *src; } src++; } *dst = &#39;\0&#39;; } 这样应该就能实现功能了。测试一下,比如输入"apple",删除&#39;p&#39;,得到"ale"。再比如删除大小写不同的字符,比如"Hello World",删除&#39;l&#39;(小写),则结果应该是"Heo Word"。 用户提供的参考引用中有类似的例子,比如引用[1]中的delcharfun函数,应该也是类似的实现。所以这个方法是可行的。 可能的问题:如果用户传入的str是只读的,比如字符串常量,这会导致错误。但题目中的函数原型是使用char *str,通常这种情况下应该由调用者确保str是可修改的。 另外,代码中是否要考虑ch的大小写问题?题目要求同一字母的大、小写按不同处理,所以不需要额外处理,直接比较即可。 现在,根据用户要求生成相关问题。</think>以下是用C语言实现删除字符串指定字符函数代码及说明: ```c void fun(char *str, char ch) { char *dst = str; // 目标指针 while (*str) { // 遍历源字符串 if (*str != ch) { *dst++ = *str; // 保留非目标字符 } str++; // 移动源指针 } *dst = &#39;\0&#39;; // 添加字符串终止符[^3] } ``` 实现原理: 1. 使用双指针技术,`dst`指针指向需要保留的位置 2. 遍历原始字符串时,仅保留不等于`ch`的字符 3. 最后添加字符串终止符`\0` 4. 时间复杂度为$O(n)$,空间复杂度为$O(1)$[^1] 示例演示: 输入字符串`"Programming"`,指定字符`&#39;g&#39;`,输出结果为`"Pro
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值