0

我正在检查用户在调用 main 时是否输入了正确数量和类型的 cmd 参数。

我认为编写一个打印出一些文本的函数是个好主意,这样我可以在检查NULL指针时重用它。我包括<errno.h>.

void errcall()
{
  perror("Error printed by perror()");
  exit(EXIT_FAILURE);
}

然后我写了一个函数来检查参数是否正确和充分。

void err_cmd_handle(int argc_input)
{
  if(argc_input==1 || argc_input>2)
    errcall(); 
}

当我在 main 中调用它并int argc作为参数给出时,我得到了成功,即使除了启动程序之外err_cmd_handle()我没有给出任何参数。为什么条件无法正确检查?

int main(int argc,char* argv[])
{
  err_cmd_handle(argc);
  return 0;
}
4

2 回答 2

3

如果您使用所需的标头获取完整的代码:

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>

void errcall()
{
  perror("Error printed by perror()");
  exit(EXIT_FAILURE);
}
void err_cmd_handle(int argc_input)
{
  if(argc_input==1 || argc_input>2)errcall(); 
}

int main(int argc,char* argv[])
{
    err_cmd_handle(argc);
    return 0;
}

然后不带参数运行它,输出为:

Error printed by perror(): Success 

显然,验证已经奏效,因为errcall()已被调用。文本“Success”只是因为 的值errno为零 - 因为没有设置它。

您更改问题之前的原始代码有:

if(argc_input==1 || argc_input>2)errcall();
  else exit(EXIT_SUCCESS); 

所以当你说:

然后我就成功了,即使除了启动程序之外我没有给出任何参数

可以合理地假设它正在通过exit(EXIT_SUCCESS);- 显然不是这样。也是你,我最初认为errno与问题无关,因为errcall()如果它返回,似乎不能被调用EXIT_SUCCESS。希望您明白为什么您的问题会引起如此多的困惑和评论?

于 2019-11-19T18:24:40.253 回答
1

Errno 尚未设置。

void errcall()
{
  printf("Value of errno: %d\n", errno);
  printf("Error: %s\n",strerror(errno));
  perror("Error printed by perror()");
  exit(EXIT_FAILURE);
}

int main(int argc,char* argv[])
{
    if(argc!=2) 
    {
       errno=EINVAL;
       errcall();
    }

    return 0;
}
于 2019-11-19T18:17:21.120 回答