垃圾邮件扫描器代码调试求助:匹配垃圾词却判定非垃圾
修复垃圾邮件扫描器代码问题
你的代码存在几个关键问题导致无法正确识别垃圾关键词,以下是问题分析和修复后的完整代码:
问题分析
- 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"); } }
修复说明
- 修复大小写转换:将
tolower(emailSearch[i])改为email[i] = tolower(email[i]),确保邮件内容全部转为小写,和关键词统一匹配。 - 遍历所有关键词:用
for循环遍历spam数组的每个元素,逐个调用strstr检查匹配,每匹配一个关键词分数加1。 - 实现分数计算与评级:根据匹配到的关键词数量,分为高度疑似、疑似、正常三个评级,符合任务要求。
- 安全处理输入:用
sizeof(email)作为fgets的读取长度,避免浪费数组空间;同时判断输入是否为空,安全替换换行符。
内容的提问来源于stack exchange,提问作者MJee
相关产品推荐
相关产品推荐

