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

CS50凯撒密码作业:如何验证C语言中argv[1]仅含数字?

问题分析与修复方案

你的代码存在几个关键错误,导致了当前的异常行为,逐一拆解如下:

1. Main函数的逻辑错误

  • 错误地将only_digits的返回值赋值给argc,argc是命令行参数的数量,不能被覆盖。正确流程是先判断argc是否等于2(确保用户传入了密钥参数),再对argv[1]调用only_digits验证。
  • 当仅输入./caesar时,argv[1]为NULL,直接传入only_digits会导致strlen(NULL)触发段错误,必须先判断argc的数量,再去访问argv[1]。

2. only_digits函数的逻辑颠倒

  • isdigit()函数返回非0值表示字符是数字,你当前的逻辑是"如果是数字就返回false(0),否则循环结束后返回true(1)",完全搞反了判断逻辑。
  • 函数不应该承担打印提示信息的职责,它只需要完成"判断字符串是否全为数字"的单一功能,提示信息应该放在main函数中统一处理。

修正后的完整代码

#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;
    }

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

    // 后续加密逻辑可以在这里继续编写
    return 0;
}

// 判断字符串是否仅包含数字字符
bool only_digits(string s)
{
    for (int i = 0, n = strlen(s); i < n; i++)
    {
        // 如果遇到非数字字符,直接返回false
        if(!isdigit(s[i]))
        {
            return false;
        }
    }
    // 所有字符都是数字,返回true
    return true;
}

修正说明

  • Main函数中先校验参数数量,避免访问argv[1]时出现空指针;再调用only_digits验证参数合法性,两次校验失败都输出提示并退出。
  • only_digits函数回归单一职责:遍历字符串,只要发现非数字字符就返回false,遍历完成后返回true,不再处理打印逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:20:28