#include<stdio.h>
#include<string.h>
void delchar(char s[20],char m);
int main()
{
char s[20],m;
printf("Input a string:");
gets(s);
printf("Input a char:");
scanf("%c",&m);
printf("After deleted,the string is:");
delchar(s,m);
puts(s);
return 0;
}
void delchar(char s[20],char m)
{
int i;
for(i=0;i<20;i++)
{
if(s[i]==m)
{
s[i]='\0';
}
}
}

我的代码错在哪里了?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
2条回答 默认 最新
关注引自免费微信小程序:皆我百晓生
在您的C语言代码中,
delchar函数的实现存在一个错误。您在发现字符匹配时将字符替换为\0(字符串结束符),这会导致剩余部分的字符串被视为结束,因此打印出来的结果可能并不是您期望的样子。要解决这个问题,您应该移动后续的字符来覆盖被删除的字符,而不是简单地替换成\0。下面是修改后的
delchar函数:void delchar(char s[20], char m) { int i, j; for (i = 0, j = 0; i < 20 && s[i] != '\0'; i++) { if (s[i] != m) { s[j++] = s[i]; } } s[j] = '\0'; // 在新字符串末尾添加'\0'以确保它是正确的字符串 }以下是完整的修正后的代码:
#include<stdio.h> #include<string.h> void delchar(char s[20], char m); int main() { char s[20], m; printf("Input a string:\n"); fgets(s, sizeof(s), stdin); // 使用fgets替代gets,因为它更安全 printf("Input a char:\n"); scanf("%c", &m); printf("After deleted, the string is:\n"); delchar(s, m); puts(s); return 0; } void delchar(char s[20], char m) { int i, j; for (i = 0, j = 0; i < 20 && s[i] != '\0'; i++) { if (s[i] != m) { s[j++] = s[i]; } } s[j] = '\0'; // 在新字符串末尾添加'\0'以确保它是正确的字符串 }这里我对代码做了两处改进:
- 将
gets()函数替换为fgets()函数,因为gets()函数有安全风险,可能会导致缓冲区溢出。 - 修改了
delchar函数,使得当找到不需要的字符时,将其后面的字符向前移动一位,然后继续遍历。最后,在新的有效字符串末尾添加\0。这样可以正确地删除指定的字符并保留其他字符顺序。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录- 将