`getopt` 与 atoi 导致分段错误

问题描述 投票:0回答:1
#include <stdio.h>
#include <getopt.h>
#include <stdlib.h>


#define PORT 12344

int main(int argc, char** argv) {
    int opt;
    int server_fd, client_fd, epoll_fd;
    int child_pid;
    int port = PORT;
    char* file = NULL;

    /* Argparse */
    static struct option long_options[] = {
        {"file", required_argument, 0, 'f'},
        {"port", optional_argument, 0, 'p'},
        {"help", no_argument, 0, 'h'},
        {NULL, 0, NULL, 0}
    };


    while ((opt = getopt_long(argc, argv, "f:p:h", long_options, NULL)) != -1) {
        switch (opt) {
            case 'f':
                printf("file is: %s\n", optarg);
                break;
            case 'p':
                port = atoi(optarg);
                // since we will be listening on port > 1024 anyway, 0 is unused
                if (!port) {
                    printf("not a valid port\n");
                    exit(1);
                }
                break;
            case 'h':
                printf("help message\n");
                exit(0);
            default:
                break;
        }
    }

    printf("end\n");
}

我正在尝试构建一个基于TCP的应用程序。我希望程序接受两个参数,一个指定配置文件的文件参数,一个基本上是要侦听的端口号的数字,其他参数工作得很好。但是,每当我尝试使用

--port ABC
选项时,程序都会因分段错误而崩溃。

我在这里缺少什么?

c tcp arguments command-line-interface command-line-arguments
1个回答
0
投票

在调用

is_numeric
之前,使用
optarg
函数检查
atoi
是否只包含数字;如果没有,则打印
"port must be a valid positive number"
并退出。这可以通过确保
optarg
在将其转换为整数之前有效来防止分段错误。

© www.soinside.com 2019 - 2024. All rights reserved.