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

CS50 substitution程序密钥校验模块报错求助

CS50 Substitution作业密钥校验问题排查

我正在完成CS50课程的Substitution作业题,编写完代码编译后运行异常——即使输入正确的密钥,程序仍输出./substitution key提示信息。我推测问题出在密钥校验环节,但参考网络上的同类代码后仍未定位到错误,现将密钥校验相关代码附上,恳请帮忙排查问题。另外,我也觉得这门课程的作业难度较高。

原代码

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

int main(int argc, string argv[])
{
    if (argc != 2)
    {
        printf("Usage: ./substituion key\n");
        return 1;
    }
    //validate the key!

    string key = argv[1];

    for (int i = 0; i < strlen(key); i++)
    {
        if (!isalpha(key[i]))
        {
            printf("Usage: ./substitution key\n");
        }
    }

    for (int j = 0; j < strlen(key); j++)
    {
        for (int k = 0; k < strlen(key); k++)
        {
            if (toupper(key[j]) == toupper(key[k]))
            {
                printf("Usage: ./substitution key\n");
                return 1;
            }
        }
    }

    if (strlen(argv[1]) != 26)
    {
        printf("Usage: ./substituion key\n");
        return 1;
    }
}

问题排查与修复

你的密钥校验逻辑存在3个核心错误,导致程序误判:

  1. 非字母字符检查未终止程序:当发现密钥包含非字母字符时,仅打印提示但未执行return 1退出,程序会继续执行后续校验流程,最终触发其他错误提示。
  2. 重复字符检查逻辑错误:双层循环中k从0开始遍历,会让每个字符与自身比较(j == k时),无论密钥是否真有重复,都会直接触发重复判断并退出程序。应将k的起始值改为j + 1,只比较当前字符之后的字符。
  3. 密钥长度校验顺序错误:长度校验放在最后,若密钥长度不是26,前面的字母检查、重复检查都是无效操作,且可能导致后续逻辑出错。应优先校验密钥长度。
  4. 拼写错误:提示信息中的./substituion少了字母t,应改为./substitution。

修正后的密钥校验代码

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

int main(int argc, string argv[])
{
    if (argc != 2)
    {
        printf("Usage: ./substitution key\n");
        return 1;
    }

    string key = argv[1];

    // 优先校验密钥长度必须为26
    if (strlen(key) != 26)
    {
        printf("Usage: ./substitution key\n");
        return 1;
    }

    // 校验密钥是否全为字母
    for (int i = 0; i < strlen(key); i++)
    {
        if (!isalpha(key[i]))
        {
            printf("Usage: ./substitution key\n");
            return 1;
        }
    }

    // 校验密钥是否有重复字符
    for (int j = 0; j < strlen(key); j++)
    {
        // k从j+1开始,避免与自身比较
        for (int k = j + 1; k < strlen(key); k++)
        {
            if (toupper(key[j]) == toupper(key[k]))
            {
                printf("Usage: ./substitution key\n");
                return 1;
            }
        }
    }

    // 后续加密逻辑...
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 20:13:25