C语言命令行参数错误检查问题:无参数运行触发段错误
问题根源分析
你碰到的段错误(Segmentation Fault)核心原因很明确:你在检查命令行参数数量之前,就提前访问了argv[1]并调用了strlen()。
当你不带参数运行程序时,argc的值是1(只有程序名本身),此时argv[1]是NULL(空指针)。而strlen()函数要求传入的参数必须是指向有效字符串的指针,把NULL传进去直接违反了函数的前置条件,触发了空指针访问的运行时错误。
修复方案
只需要调整代码的执行顺序,把参数数量检查放在所有访问argv[1]的操作之前,同时优化一些冗余的判断逻辑:
#include <stdio.h> #include <string.h> #include <ctype.h> int main(int argc, char *argv[]) { // 第一步:先检查参数数量是否正确 if (argc != 2) { printf("Usage: ./substitution key\n"); return 1; } // 参数数量正确后,再安全地访问argv[1] char *key = argv[1]; int n = strlen(key); // 第二步:检查密钥长度是否为26,放在循环外只需判断一次,不用重复执行 if (n != 26) { printf("Key must contain 26 characters.\n"); return 1; } // 第三步:验证密钥的字符合法性和唯一性 for (int i = 0; i < n; i++) { // 检查是否为字母 if (!isalpha(key[i])) { printf("Key must contain only alphabetic characters.\n"); return 1; } // 检查是否有重复字符 for (int j = i + 1; j < n; j++) { // 建议统一转成小写(或大写)后再比较,避免大小写不同但字符相同的情况 if (tolower(key[i]) == tolower(key[j])) { printf("Key must not contain repeated characters.\n"); return 1; } } } // 这里可以继续写后续的加密逻辑 return 0; }
额外提示(给C语言新手)
- C语言中,
argv数组的最后一个元素是NULL,当没有额外命令行参数时,argv[1]就等于这个NULL,绝对不能直接对它调用字符串操作函数(比如strlen、strcpy等)。 - 把参数合法性检查放在最前面是一个通用的编程习惯,可以避免后续代码访问无效的资源。
- 我在重复字符检查里加了
tolower(),是因为通常这类替换密钥不区分大小写(比如'A'和'a'视为重复),如果你的需求是严格区分大小写,可以去掉这个转换。
内容的提问来源于stack exchange,提问作者michael
相关产品推荐
相关产品推荐

