C题求解

「已注销」 2016-12-14 10:13:22
编制函数del_char
函数原型为 void del_char(char a[],char ch),函数的功能是删除a指向的字符串中值为ch的字符,例如从字符串"AscADef"中删除'A'后,字符串为"scDef"。
看看为什么错了。OJ说越界了。
#include<stdio.h>
#include<string.h>
void del_char(char a[],char)
int main()
{
int n;
char ch,s[20];
ch=getchar();
scanf("%s",s);
del_char(s,ch);
printf("%s",s);
return 0;
}
void del_char(char s[],char ch)
{
int i,j,n;
n=strlen(s);
for(i=0;i<n;i++)
{
if(ch==s[i])
{
for(j=i;j<n;j++)
s[j]=s[j+1];
n--;
}
}
}
...全文
236 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
此人似曾相识 2016-12-15
  • 打赏
  • 举报
回复
引用 9 楼 qq_24138885 的回复:
[quote=引用 8 楼 qq_24138885 的回复:]

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

void del_char(char a[], char);
int main()
{
	char s[20] = {0};
	char ch = 'a';
	scanf("%s", s);
	getchar();
	scanf("%c", &ch);

	printf("原始字符串为:%s \n", s);
	printf("要截取的字符串为:%c \n", ch);
	printf("截取后字符串为:");
	del_char(s, ch);
	return 0;
}
void del_char(char s[], char ch)
{
	unsigned int i, n;
	n = strlen(s);
	char tmp[30] = {0};

	for (i = 0; i < n; i++)
	{
		if (s[i] != '\0') 
		{
			if (ch != s[i])
			{
				strncpy(&tmp[i],&s[i],1);
				printf("%c", tmp[i]);
			}
		}
	}
	printf("\n");
}
第8行改为 char ch = {0};[/quote] 是第九行
此人似曾相识 2016-12-15
  • 打赏
  • 举报
回复
引用 8 楼 qq_24138885 的回复:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

void del_char(char a[], char);
int main()
{
	char s[20] = {0};
	char ch = 'a';
	scanf("%s", s);
	getchar();
	scanf("%c", &ch);

	printf("原始字符串为:%s \n", s);
	printf("要截取的字符串为:%c \n", ch);
	printf("截取后字符串为:");
	del_char(s, ch);
	return 0;
}
void del_char(char s[], char ch)
{
	unsigned int i, n;
	n = strlen(s);
	char tmp[30] = {0};

	for (i = 0; i < n; i++)
	{
		if (s[i] != '\0') 
		{
			if (ch != s[i])
			{
				strncpy(&tmp[i],&s[i],1);
				printf("%c", tmp[i]);
			}
		}
	}
	printf("\n");
}
第8行改为 char ch = {0};
此人似曾相识 2016-12-15
  • 打赏
  • 举报
回复

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

void del_char(char a[], char);
int main()
{
	char s[20] = {0};
	char ch = 'a';
	scanf("%s", s);
	getchar();
	scanf("%c", &ch);

	printf("原始字符串为:%s \n", s);
	printf("要截取的字符串为:%c \n", ch);
	printf("截取后字符串为:");
	del_char(s, ch);
	return 0;
}
void del_char(char s[], char ch)
{
	unsigned int i, n;
	n = strlen(s);
	char tmp[30] = {0};

	for (i = 0; i < n; i++)
	{
		if (s[i] != '\0') 
		{
			if (ch != s[i])
			{
				strncpy(&tmp[i],&s[i],1);
				printf("%c", tmp[i]);
			}
		}
	}
	printf("\n");
}
WQW217 2016-12-15
  • 打赏
  • 举报
回复
学生党  挺多的   我们老师要求我们  进csdn  期末检查论坛积分
van-link 2016-12-15
  • 打赏
  • 举报
回复
strlen()返回的字符串长度和字符数组的下标是不一样的。
小灸舞 版主 2016-12-15
  • 打赏
  • 举报
回复
1.你的for (j = i; j<n; j++)s[j] = s[j + 1];这个会越界,如果j等于n-1的时候,s[j+1]会越界
2.出于效率考虑,你其实不需要每次都从i前移到n(前移到'\0'的位置就行了)
cocoabird 2016-12-15
  • 打赏
  • 举报
回复
改成j<n-1就对了
赵4老师 2016-12-15
  • 打赏
  • 举报
回复
“多一少一”问题占程序员常犯错误的10%以上! 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断,掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个? <、<=、==、>、>=中的哪个?
paschen 2016-12-14
  • 打赏
  • 举报
回复
void del_char(char a[],char) 声明后少了分号 s[20] 设置大一点,否则字符串长度只有20字符
ck2333 2016-12-14
  • 打赏
  • 举报
回复
当j=n-1的时候,那么请问你的j+1又是多少呢??

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧