删除@后边的字符出现了问题

#include<stdio.h>
#include<string.h>
#define n 1000
void del(char *ch,char ch1);
int main(){
    int t,i,j,k;
    char ch[n];
    gets(ch);
    t=strlen(ch);
    for(i=0;ch[i]!='\0';i++){
        if(ch[i]>=48&&ch[i]<=57)
        {del(ch,ch[i]);t--;
        }
         if(ch[i]==45){del(ch,ch[i]);t--;
         }

         if(ch[i]==64||ch[i]==35){
            k=i;
            del(ch,ch[i]);
            t--;
            if(ch[k]!=' '){
                while(ch[k]!=' '){
                    del(ch,ch[k]);
                    t--;
                    k++;
                }
            }
        }
        if(ch[i]==46&&ch[i+1]==46&&ch[i+2]==46)
        {del(ch,ch[i]);del(ch,ch[i+1]);del(ch,ch[i+2]);
        t-=3;
        }
    }
    puts(ch);
    return 0;
} 

void del(char* s, char c) {
int k, i;
 for (k = i = 0; s[i]; i++) 
 if (s[i] != c)
{s[k] = s[i];
    k++;}
s[k] = '\0'; 
}

代码中的问题在于使用了已经被废弃的函数gets(),而且在删除字符时存在一些逻辑上的错误。此外,还存在一些不规范的写法,例如没有进行错误处理和缺少必要的注释。下面是修改后的代码:


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

#define MAX_LENGTH 1000

void del(char* ch, char ch1);

int main() {
    int t, i, k;
    char ch[MAX_LENGTH];

    fgets(ch, MAX_LENGTH, stdin); // 使用安全的 fgets() 代替 gets()

    t = strlen(ch);

    for (i = 0; ch[i] != '\0'; i++) {
        if (ch[i] >= '0' && ch[i] <= '9') {
            del(ch, ch[i]);
            t--;
            i--; // 处理完删除字符后,需要回退一个位置重新检查当前位置
        }
        else if (ch[i] == '-') {
            del(ch, ch[i]);
            t--;
            i--;
        }
        else if (ch[i] == '@' || ch[i] == '#') {
            k = i;
            del(ch, ch[i]);
            t--;
            if (ch[k] != ' ') {
                while (ch[k] != ' ') {
                    del(ch, ch[k]);
                    t--;
                    k++;
                }
            }
            i = k - 1; // 处理完删除字符后,需要回退到 @ 或 # 的前一个位置重新检查当前位置
        }
        else if (ch[i] == '.' && ch[i + 1] == '.' && ch[i + 2] == '.') {
            del(ch, ch[i]);
            del(ch, ch[i]); // 连续删除三个点
            del(ch, ch[i]);
            t -= 3;
            i--; // 处理完删除字符后,需要回退一个位置重新检查当前位置
        }
    }

    printf("%s", ch);

    return 0;
}

void del(char* s, char c) {
    int k, i;
    for (k = i = 0; s[i]; i++) {
        if (s[i] != c) {
            s[k] = s[i];
            k++;
        }
    }
    s[k] = '\0';
}

这里主要做了以下几点修改:

1、使用fgets()代替gets()以避免缓冲区溢出问题。
2、将宏定义n改为MAX_LENGTH,使其更易读。
3、修改了字符的比较方式,将数字的 ASCII 值与字符进行比较。
4、在删除字符后,需要回退一个位置重新检查当前位置,因为后面的字符会往前移动填补被删除的位置。
5、修改了最后的输出方式,使用printf()代替puts()。