You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

垃圾邮件扫描器代码调试求助:匹配垃圾词却判定非垃圾

修复垃圾邮件扫描器代码问题

你的代码存在几个关键问题导致无法正确识别垃圾关键词,以下是问题分析和修复后的完整代码:

问题分析

  • tolower调用未生效:原代码中tolower(emailSearch[i])仅计算了小写字符,但未将结果赋值回原数组,导致输入的大写关键词无法匹配。
  • 未遍历所有垃圾关键词:strstr(emailSearch, spam)中的spam是数组首地址,只会检查第一个关键词"congratulation",其余29个关键词完全没参与判断。
  • 缺少分数计算与评级逻辑:未实现任务要求的「扫描关键词计算垃圾分数并评级」功能,仅做了简单的存在性判断。
  • 输入处理有隐患:fgets(email, 80, stdin)限制了输入长度为80,但数组email定义为1000;且直接修改email[strlen(email)-1]未考虑输入为空的情况,会导致数组越界。

修复后的代码

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

// 计算垃圾分数并评级
void calculateSpamScore(char *email);

// 30个垃圾邮件关键词
const char spam[][30] = {
    "congratulation", "free", "100%", "earn", "million",
    "click", "here", "instant", "limited", "urgent",
    "winner", "selected", "bargain", "deal", "debt",
    "lifetime", "cheap", "easy", "bonus", "credit",
    "bullshit", "scam", "junk", "spam", "passwords",
    "invest", "bulk", "exclusive", "win", "sign"
};

int main(){
    char email[1000];
    printf("Enter your email message: \n");
    // 读取完整输入,直到数组上限或换行
    fgets(email, sizeof(email), stdin);
    
    // 安全处理换行符:如果最后一个字符是换行,替换为结束符
    size_t len = strlen(email);
    if(len > 0 && email[len-1] == '\n'){
        email[len-1] = '\0';
    }
    
    calculateSpamScore(email);
    return 0;
}

void calculateSpamScore(char *email){
    // 1. 将邮件内容转为小写,消除大小写影响
    int i = 0;
    while(email[i]){
        email[i] = tolower(email[i]);
        i++;
    }
    
    int spamScore = 0;
    int totalKeywords = sizeof(spam)/sizeof(spam[0]);
    
    // 2. 遍历所有关键词,统计匹配次数作为分数
    for(int j = 0; j < totalKeywords; j++){
        if(strstr(email, spam[j]) != NULL){
            spamScore++;
        }
    }
    
    // 3. 根据分数评级
    printf("垃圾邮件分数:%d\n", spamScore);
    if(spamScore >= 5){
        printf("评级:**高度疑似垃圾邮件**\n");
    } else if(spamScore >= 2){
        printf("评级:**疑似垃圾邮件**\n");
    } else {
        printf("评级:**正常邮件**\n");
    }
}

修复说明

  1. 修复大小写转换:将tolower(emailSearch[i])改为email[i] = tolower(email[i]),确保邮件内容全部转为小写,和关键词统一匹配。
  2. 遍历所有关键词:用for循环遍历spam数组的每个元素,逐个调用strstr检查匹配,每匹配一个关键词分数加1。
  3. 实现分数计算与评级:根据匹配到的关键词数量,分为高度疑似、疑似、正常三个评级,符合任务要求。
  4. 安全处理输入:用sizeof(email)作为fgets的读取长度,避免浪费数组空间;同时判断输入是否为空,安全替换换行符。

内容的提问来源于stack exchange,提问作者MJee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 05:40:37