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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 09:48:12