#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()。