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

CS50凯撒密码作业:实现only_digits函数校验命令行参数

CS50 Week 2 凯撒密码(Caesar)作业问题

问题概述

正在完成CS50 Week2数组章节的凯撒密码Problem Set2作业,需要实现一个bool only_digits(string s)函数,用于校验命令行参数是否全为数字,校验通过后还要将该字符串密钥转为整数在main中使用,但目前卡在函数实现上,不想看完整解决方案,希望自行理解解决。

当前代码

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

bool only_digits(string s);

int main(int argc, string argv[])
{
   if(argc != 2)
   {
      printf("USAGE: ./caesar KEY\n");
      return 1;
   }
   return 0;
}

bool only_digits(string s)

if (! isdigit, (argv[1]))
{
   printf("INVAILD: USAGE: ./caesar KEY\n");
   return 1;
}
return 0;

代码中的核心问题

  1. 函数语法错误:only_digits函数定义后未用{}包裹函数体,导致语法不合法。
  2. isdigit用法错误:isdigit是C标准库函数,仅接收单个字符作为参数,你写的isdigit, (argv[1])这种逗号表达式完全不符合函数调用规范。
  3. 参数传递错误:only_digits的参数是string s,但你在函数内直接引用argv[1],属于错误的全局访问——函数应处理传入的s参数,而非直接依赖main中的变量。
  4. 校验逻辑缺失:isdigit只能检查单个字符,要判断整个字符串是否全为数字,需要遍历字符串的每一个字符逐个验证。

概念确认

你的理解完全正确:命令行参数确实是以字符串形式存储的。比如输入./caesar 3时,argv[1]是字符串"3",而非整数3。必须先校验该字符串的每一位都是数字,再将其转换为整数类型使用。

分步修正提示

  1. 修复函数结构:给only_digits函数添加{},将函数逻辑写在内部:
    bool only_digits(string s)
    {
        // 函数逻辑写在这里
    }
    
  2. 遍历字符串校验每个字符:用循环遍历s的每个字符(可通过strlen(s)获取字符串长度),对每个字符调用isdigit()检查,若遇到非数字字符直接返回false;遍历完成后返回true。

    注意:isdigit的参数建议强制转换为unsigned char,避免字符为负时的未定义行为,写法为isdigit((unsigned char)c)

  3. 在main中调用函数:在main的argc校验通过后,调用only_digits(argv[1]),若返回false则输出错误信息并退出;若返回true,再用atoi()(或CS50提供的stoi())将argv[1]转换为整数。
  4. 修正函数返回值:only_digits是bool类型函数,规范写法应返回true或false,而非1或0(虽然C中bool与int兼容,但遵循类型规范更清晰)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 06:12:32