c++ - 段错误 - 使用 getopt 时发生核心转储错误

标签 c++ c unix gcc ansi

我知道这个问题已经被问过很多次了,但我还是想不通

#include<stdio.h>
#include<getopt.h>
int ch;
int queue_time=60;
int thread_num=4;
char *scheduling_algo="FCFS";
extern char *optarg;
int port=8080;
int debug_flag,h_flag,l_flag;
int main(int argc,char *argv[])
{
  while ((ch = getopt(argc, argv, "dhlprtns")) != -1)
switch(ch)
{
  case 'd':
    debug_flag=atoi(optarg);        /* print address in output */
    break;
  case 'h':
    h_flag=atoi(optarg);
    break;
  case 'l':
    l_flag=atoi(optarg);; 
    break;
  case 'p':
    port = atoi(optarg);
    break;
case 'r':
    printf("%s",optarg); 
    break;
case 't':
    queue_time = atoi(optarg);
    break;
case 'n':
    thread_num = atoi(optarg);
    break;
case 's':
    scheduling_algo = optarg;
    break;
default:
    printf("nothing was passed");
}

    printf("%d",queue_time);
    printf("%d",debug_flag);
    printf("%d",h_flag);
    printf("%d",l_flag);
}   

我正在使用以下命令执行我的程序

./a.out -d -h -l -t 55

我收到核心转储错误。我在谷歌上阅读了几个例子,但我仍然面临这个问题。有人可以帮忙吗?

最佳答案

您需要阅读 getopt() 的手册页

  while ((ch = getopt(argc, argv, "dhlprtns")) != -1)
                                   ^^^^^^^^

这与您使用参数的方式不符。你 在需要参数的标志之后需要冒号“:”。在你的代码中 “d”后面没有跟冒号,但您似乎想要它的值:

  case 'd':
    debug_flag=atoi(optarg);        /* print address in output */
    break;

所以发生的事情是你正在调用 atoi(0),这是段错误。

这是手册页中的示例,请注意“b”后面没有跟一个 冒号而 "f"是。

#include <unistd.h>
 int bflag, ch, fd;

 bflag = 0;
 while ((ch = getopt(argc, argv, "bf:")) != -1) {
         switch (ch) {
         case 'b':
                 bflag = 1;
                 break;
         case 'f':
                 if ((fd = open(optarg, O_RDONLY, 0)) < 0) {
                         (void)fprintf(stderr,
                             "myname: %s: %s\n", optarg, strerror(errno));
                         exit(1);
                 }
                 break;
         case '?':
         default:
                 usage();
         }
 }
 argc -= optind;
 argv += optind;

关于c++ - 段错误 - 使用 getopt 时发生核心转储错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19672153/

相关文章:

java - 为什么我不能通过套接字连接android和PC?

c++ - 在 Windows 上从服务器端检测 RPC 连接丢失

php - session_start() 失败 : Permission denied (13)

unix - 如何在unix中查找最近一小时内创建的文件

java - 我应该同时学习C++和Java吗?

c++ - Qt 5.1 for OSX 安装仅包含 clang_64 目录,如何使用 macports gcc 进行编译?

c - 使用主体中的输入,以便用户可以编辑

c - 如何使数据库大小超过 256 字节 [链接器文件 - MPLAB]

C 程序,从一个文件中获取一对数字,计算 newton(n,k),并将答案写入另一个文件

linux - 在什么情况下文件的物理大小会小于逻辑大小?