2401_84401465 2024-06-07 15:57 采纳率: 71.4%
浏览 3
已结题

我的代码错在哪里了?

#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';
        }
    }
}
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/9a73aaae0d4e4358b728440325d1dfd2.png "#left")
  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-06-07 15:57
    关注

    引自免费微信小程序:皆我百晓生

    在您的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'以确保它是正确的字符串
    }
    

    这里我对代码做了两处改进:

    1. gets()函数替换为fgets()函数,因为gets()函数有安全风险,可能会导致缓冲区溢出。
    2. 修改了delchar函数,使得当找到不需要的字符时,将其后面的字符向前移动一位,然后继续遍历。最后,在新的有效字符串末尾添加\0。这样可以正确地删除指定的字符并保留其他字符顺序。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月15日
  • 已采纳回答 6月7日
  • 创建了问题 6月7日