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

