Как вы обрабатываете неизвестное количество аргументов командной строки? - PullRequest
0 голосов
/ 09 апреля 2019

Я делаю тип Node-клиента, который принимает в качестве параметров:

./node <port> <address> <neighbourAddress>:<weight> 

Я обработал порт и адрес и сохранил их значения в каждой из своих переменных через atoi. Тем не менее, я не знаю, как справиться с

<neighbourAddress>:<weight> 

как они могут появляться неоднократно. Э.Г.

./node 8888 1 26:2 34:3 12:8

В этом случае оно появляется три раза, но не ограничивается только этой суммой. Что мне нужно сделать, чтобы прочитать аргументы, разделенные ':', и сохранить их значения в переменной?

Вот что у меня есть:

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

#include "print_lib.h"

int port;
int ownAddress;

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

    if(argc >= 3){

        /* to receive port number */
        port = atoi(argv[1]);
        if((port <= 1024 || port >= 65535) && port != 0){
            fprintf(stderr, "Port number has to be between 1024 and 65535.\n");
            exit(EXIT_FAILURE);
        }

        /* to receive ownaddress */
        ownAddress = atoi(argv[2]);
        if(ownAddress >= 1024 && ownAddress != 0){
            fprintf(stderr, "Node's address has to be less than 1024.\n");
            exit(EXIT_FAILURE);
        }

        /* below here is where I need to handle reoccuring arguments */
        /* in the format <neighbourAddress>:<weight> */

    }
    else {
        fprintf(stderr, "Too few arguments\n");
        exit(EXIT_FAILURE);
    }
}

Ответы [ 2 ]

2 голосов
/ 09 апреля 2019

Используйте цикл в сочетании с sscanf:

for (int i = 3; i < argc; i++) {
    int addr, weight;
    if (sscanf(argv[i], "%d:%d", &addr, &weight) != 2) ERROR();
    // use values here, e.g. assign them into an array.
}
1 голос
/ 09 апреля 2019

Используйте argc, чтобы получить количество входных параметров, вычтите: имя программы, порт, адрес, и у вас останется количество <neighbourAddress>:<weight> входов, после чего вы можете просто просмотреть их. то есть число <neighbourAddress>:<weight> равно argc - 3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...