零零年代的风 2020-04-03 20:58 采纳率: 0%
浏览 118

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

#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'; 
}
  • 写回答

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实现文字转语音?