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
相关产品推荐
相关产品推荐

