【问题标题】:Segmentation Fault Due to Lack of Command Line Argument (argv[1])由于缺少命令行参数 (argv[1]) 导致的分段错误
【发布时间】:2021-02-09 03:22:39
【问题描述】:

这段代码用于检查用户是否只输入了一个数字命令行参数,如果不是这样,则返回错误代码“1”。我设置了代码,以便它首先检查 argc 是否不是 2。不幸的是,如果没有输入命令行参数,我仍然会收到分段错误,而且我不确定为什么这段代码没有捕获 null命令行参数的数量。

我尝试将“if (argc !=2)”公式移到整个“for”语句上方,以尝试从一开始就捕获命令行参数问题,但我收到了相同的结果。

我的问题是,为什么我在没有提供命令行参数的情况下会收到分段错误,我缺少什么来确保程序在没有命令行参数的情况下不会出现分段错误?

由于课程政策,我将只提供有问题的代码段。

#include <unistd.h>
#include <cs50.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>


int main(int argc, string argv[])
{
    // add'l variables //
    int k = atoi(argv[1]);

    for (int i = 0; i < strlen(argv[1]); i++)
    {
        if (argc != 2)
        {
            printf("Please enter only 1 command-line argument.\n");
            return 1;
        }
        else if (!isdigit(argv[1][i]))
        {
            printf("Usage: ./caesar key\n");
            return 1;
        }
    }
// add'l code //

Error as shown in Terminal

【问题讨论】:

  • 问题出现在int k = atoi(argv[1])这一行,在此之前做argc检查。
  • 您收到分段错误,因为您尝试访问不存在的内容。您确实提供了至少一个命令行参数(可执行文件),但您的代码至少需要 2 个运行。

标签: c cs50 caesar-cipher


【解决方案1】:

在使用argv[1] 之前必须先检查argc,因为如果argc &lt; 2argv[1] 可能没有有效的指针。您的代码的更正版本可能是这样的:

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

int main(int argc, char *argv[])
{
    int i = 0;
    if (argc != 2) {
        printf("Please enter only 1 command-line argument.\n");
        return 1;
    }
    while (isdigit(argv[1][i]))
               ++i;
    if (argv[1][i] != '\0') {
        printf("Usage: ./caesar key\n");
        return 1;
    }

    return 0;
}

【讨论】:

    猜你喜欢
    • 2020-11-19
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 2017-06-23
    相关资源
    最近更新 更多