#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';
}
删除@后边的字符出现了问题
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- 芣苢的成长之路 2023-06-27 01:26关注
代码中的问题在于使用了已经被废弃的函数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()。解决 无用评论 打赏 举报
悬赏问题
- ¥15 Coze智能助手搭建过程中的问题请教
- ¥15 12864只亮屏 不显示汉字
- ¥20 三极管1000倍放大电路
- ¥15 vscode报错如何解决
- ¥15 前端vue CryptoJS Aes CBC加密后端java解密
- ¥15 python随机森林对两个excel表格读取,shap报错
- ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
- ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。
- ¥30 求给定范围的全体素数p的(p-2)/p的连乘积值
- ¥15 VFP如何使用阿里TTS实现文字转语音?