【问题标题】:Checking Command Line arguments for error in C在 C 中检查命令行参数是否有错误
【发布时间】:2020-06-29 14:56:51
【问题描述】:

我正在尝试检查参数计数,如果命令行中没有参数或超过 2 个参数,则应该是 return 1:

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

int main(int argc, char *argv[])
{
    char *key = argv[1]; //taking the key from CL    
    int n = strlen(key); //length of CL arg string    
    
    if (argc != 2) //checks the amount of CL args
    {
        printf("Usage: ./substitution key\n");
        return 1;
    }

    for (int i = 0; i < n; i++) //validating the key array
    {
        if (n != 26)
        {
            printf("Key must contain 26 characters.\n");
            return 1;
        }
        else if (!isalpha(key[i]))
        {
            printf("Key must contain only alphabetic character.\n");
            return 1;
        }
        for (int j = i + 1; j < n; j++)
        {
            if (key[i] == key[j])
            {
                printf("Key must not contain repeated characters.\n");
                return 1;
            }
        }                
    }
}

当我在没有参数的情况下运行时会引发错误:

运行时错误:作为参数 1 传递的空指针,它被声明为永远不会为空 分段错误(核心转储)。

如果我在评论密钥验证部分,它会运行。 我是C 编程 的新手,并且在 Google 上搜索了很多。 请帮我找出原因?

【问题讨论】:

  • 如果没有参数,则尝试访问 argv[1] 会产生未定义的行为 IMO。

标签: c runtime-error


【解决方案1】:

您首先访问argv[1],它可能不存在,然后您检查argc 以查看它是否存在。这是错误的顺序。先查argc,再访问argv[1]:

int main(int argc, char *argv[])
{
    if (argc != 2) //checks the amount of CL args
    {
        printf("Usage: ./substitution key\n");
        return 1;
    }

    char *key = argv[1]; //taking the key from CL    
    int n = strlen(key); //length of CL arg string    
    
    // remaining code...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 2016-04-15
    • 2016-02-09
    • 2014-02-16
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多