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;
代码中的核心问题
- 函数语法错误:
only_digits函数定义后未用{}包裹函数体,导致语法不合法。 - isdigit用法错误:
isdigit是C标准库函数,仅接收单个字符作为参数,你写的isdigit, (argv[1])这种逗号表达式完全不符合函数调用规范。 - 参数传递错误:
only_digits的参数是string s,但你在函数内直接引用argv[1],属于错误的全局访问——函数应处理传入的s参数,而非直接依赖main中的变量。 - 校验逻辑缺失:
isdigit只能检查单个字符,要判断整个字符串是否全为数字,需要遍历字符串的每一个字符逐个验证。
概念确认
你的理解完全正确:命令行参数确实是以字符串形式存储的。比如输入./caesar 3时,argv[1]是字符串"3",而非整数3。必须先校验该字符串的每一位都是数字,再将其转换为整数类型使用。
分步修正提示
- 修复函数结构:给
only_digits函数添加{},将函数逻辑写在内部:bool only_digits(string s) { // 函数逻辑写在这里 } - 遍历字符串校验每个字符:用循环遍历
s的每个字符(可通过strlen(s)获取字符串长度),对每个字符调用isdigit()检查,若遇到非数字字符直接返回false;遍历完成后返回true。注意:
isdigit的参数建议强制转换为unsigned char,避免字符为负时的未定义行为,写法为isdigit((unsigned char)c) - 在main中调用函数:在main的argc校验通过后,调用
only_digits(argv[1]),若返回false则输出错误信息并退出;若返回true,再用atoi()(或CS50提供的stoi())将argv[1]转换为整数。 - 修正函数返回值:
only_digits是bool类型函数,规范写法应返回true或false,而非1或0(虽然C中bool与int兼容,但遵循类型规范更清晰)。
内容的提问来源于stack exchange,提问作者Nikki Marie
相关产品推荐
相关产品推荐

