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

