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

C语言作业访问程序参数时出现Segmentation Fault(Core Dumped)错误

段错误触发原因

  • argv数组越界访问
    C语言中argc代表命令行参数的总个数,argv数组的合法下标范围是0 ~ argc-1,argv[argc]本身是NULL指针。你的外层循环写的是for (i = 0; i <= argc; i++),循环体内直接访问argv[i+1][j]:当i = argc-1时,i+1 = argc,访问argv[argc][j]等价于对NULL指针解引用,直接触发段错误;当i = argc时越界更严重。
  • morse数组下标越界
    morse数组总长度只有36,合法下标是0 ~ 35。如果你的命令行参数个数超过36,i的值会超过35,访问morse[i]也会触发越界访问,导致段错误。

其他逻辑问题

  • 循环逻辑完全倒置:你当前的逻辑是把第i个输入参数和morse数组的第i项对比,不符合摩斯码转字符的功能需求。正确逻辑应该是:外层循环遍历每一个输入的摩斯码参数,内层循环遍历整个morse数组,对比当前摩斯码和数组项是否匹配。
  • 字符串比较逻辑冗余错误:你手动逐字符对比的逻辑有漏洞,且固定循环j<7不合理,直接调用标准库函数strcmp即可完成字符串匹配,不需要手动实现。
  • 缺少参数校验:没有判断用户是否传入了命令行参数,如果用户直接运行程序不带参数,argv[1]直接是NULL,访问就会报错。

修复参考代码

#include <stdio.h>
#include <ctype.h>
#include <string.h>

/**
 * Short description in 2 - 3 sentences.
 *
 * @author     Lastname, Firstname
 * @assignment ICS 212 Assignment XX
 * @date       Today's date
 */

#define SIZE 36

const char *morse[SIZE] = {
    "0 -----",
    "1 .----",
    "2 ..---",
    "3 ...--",
    "4 ....-",
    "5 .....",
    "6 -....",
    "7 --...",
    "8 ---..",
    "9 ----.",
    "a .-",
    "b -...",
    "c -.-.",
    "d -..",
    "e .",
    "f ..-.",
    "g --.",
    "h ....",
    "i ..",
    "j .---",
    "k -.-",
    "l .-..",
    "m --",
    "n -.",
    "o ---",
    "p .--.",
    "q --.-",
    "r .-.",
    "s ...",
    "t -",
    "u ..-",
    "v ...-",
    "w .--",
    "x -..-",
    "y -.--",
    "z --..",
};

int main(int argc, char *argv[]) {
    int input_idx, morse_idx;
    // 参数合法性校验
    if (argc < 2) {
        printf("请传入摩斯码作为命令行参数\n");
        return 1;
    }

    // 遍历每个输入的摩斯码参数,argv[0]是程序名,从下标1开始
    for (input_idx = 1; input_idx < argc; input_idx++) {
        // 遍历morse数组查找匹配项
        for (morse_idx = 0; morse_idx < SIZE; morse_idx++) {
            // morse数组每一项格式为"字符 摩斯码",跳过第一个字符和空格,从下标2开始对比
            if (strcmp(argv[input_idx], morse[morse_idx] + 2) == 0) {
                printf("%c", morse[morse_idx][0]);
                break;
            }
        }
    }
    printf("\n");
    return 0;
}

使用示例:编译后运行./程序名 .- -...,会输出ab。


内容的提问来源于stack exchange,提问作者Hammahness808

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:06:00