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

CS50 Pset2:only_digits函数遇非数字字符串不输出错误信息

CS50 Pset2 密钥校验问题修复方案

核心问题

你的only_digits函数逻辑完全错误:

  • 当前代码遇到第一个数字就直接return true,根本不会继续检查后续字符,导致包含非数字的密钥(比如1a23)会被误判为有效
  • 只有第一个字符非数字时才返回false,完全违背了"全数字校验"的需求

另外main函数存在逻辑漏洞:当argc == 2时直接return 0,跳过了密钥校验步骤就退出程序。

修复后的完整代码

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

bool only_digits(string s);

int main(int argc, string argv[]) {
    // 简化参数数量判断逻辑
    if (argc != 2) {
        printf("Usage: ./caesar key\n");
        return 1;
    }

    // 校验密钥是否全为数字
    bool check_argv = only_digits(argv[1]);
    if (!check_argv) {
        printf("Usage: ./caesar key\n");
        return 1;
    }

    // 此处可继续编写凯撒密码的核心逻辑(如将密钥转换为整数等)
    return 0;
}

bool only_digits(string s) {
    for (int i = 0; i < strlen(s); i++) {
        // 只要发现一个非数字字符,立即返回false并终止检查
        if (!isdigit(s[i])) {
            return false;
        }
        // 若当前字符是数字,无需额外操作,循环会自动进入下一次迭代
    }
    // 所有字符检查完毕且均为数字,返回true
    return true;
}

关键逻辑说明

  • only_digits函数:遍历字符串每一个字符,一旦检测到非数字字符就立刻返回false;只有当所有字符都通过数字校验后,才返回true。
  • main函数:先判断参数数量是否合法,再执行密钥校验,通过校验后才继续后续流程,避免提前退出导致校验失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 11:52:08