【问题标题】:Segmentation Fault and isalpha分段错误和 isalpha
【发布时间】:2020-12-31 19:37:35
【问题描述】:

我想在使用命令行参数和isalpha() 时澄清我对分段错误的理解,但这种特殊情况让我更加困惑。 所以我宣布 argv[1]char * 是一种解决方法,正如 this SO answer所建议的那样。

但是,如果我使用的命令行参数少于 2 个,Segmentation Fault 仍然会出现,并且 isalpha() 在 if 3rd 条件中被忽略

#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h> //atoi is here

int main(int argc, char* argv[]){


    char *input = argv[1];
    // Error handling
    if ((argc > 2) || (argc < 1) || (isalpha(input[1])))
    {
        printf("Unwanted input\n");
        return 1;
    }
   
    return 0;

}

为什么我在不使用命令行参数时得到undefined behaviour,为什么isalpha() 会被忽略而不是给我一个段错误?

感谢您花时间阅读这篇文章

【问题讨论】:

  • 不提供参数时会出现段错误,因为在这种情况下,argc 为 1; argv[1] 为 NULL,而 NULL[1] 是未定义的行为,通常是段错误(因此永远不会调用 isalpha,因为它的参数无法计算)。
  • char *input = argv[1]; 应该在您检查 argc &gt; 1 之后,而不是之前。顺便说一句,我不建议对char * 进行类型定义。只是明确而不是隐藏指针。
  • string 来自哪里?
  • @alk 可能来自一个未说明的#include &lt;cs50.h&gt;,在这种情况下,它是typedef for char*
  • @rici。感谢您的回答! isalpha() 即使在解决了段错误之后仍然什么都不做。我什至尝试将它放在单独的if else 语句中。 else if (isalpha(input[1])) { printf("Not accepting alphabet\n"); }

标签: c segmentation-fault command-line-arguments isalpha


【解决方案1】:

当你执行没有args的程序时,argc1(因为程序名本身也算作一个arg),argv[1]NULL

(argc > 2) || (argc < 1)   // Considers argc == 1 and argc == 2 acceptable

应该是

(argc > 2) || (argc < 2)    // Only considers argc == 2 acceptable

或者只是

argc != 2

【讨论】:

    猜你喜欢
    • 2020-12-08
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 2020-10-12
    相关资源
    最近更新 更多