Несколько для петель в зависимости от условий - PullRequest
0 голосов
/ 17 апреля 2019

Я написал код ниже, он работает нормально. Но как-то я, как новичок, не чувствую себя комфортно и думаю, что можно написать это короче.

Код в основном обнаруживает xxx в ipAddress [0-4] и затем печатает блок ips.

Мой вопрос: возможно ли написать этот более короткий и эффективный, другими словами, могу ли я сделать глубину цикла for зависимой от значения ipaddress [0] - [4]

Спасибо.

   short ipAddress[4];

   extractIpAddress(argv[1],&ipAddress[0]);



printf("\nIp Address: %03d. %03d. %03d. %03d\n",ipAddress[0],ipAddress[1],ipAddress[2],ipAddress[3]);

if(ipAddress[0] == 255) {
 for ( ipAddress[0]=0; ipAddress[0] <= 255; ++ipAddress[0] )
    for ( ipAddress[1]=0; ipAddress[1] <= 255; ++ipAddress[1] )
        for (ipAddress[2]=0; ipAddress[2] <= 255; ++ipAddress[2] )
            for (ipAddress[3]=0; ipAddress[3] <= 255; ++ipAddress[3] )
                printf( "%d.%d.%d.%d\n", ipAddress[0], ipAddress[1], ipAddress[2], ipAddress[3]);
}
else if(ipAddress[1] ==255) {
    for ( ipAddress[1]=0; ipAddress[1] <= 255; ++ipAddress[1] )
        for (ipAddress[2]=0; ipAddress[2] <= 255; ++ipAddress[2] )
            for (ipAddress[3]=0; ipAddress[3] <= 255; ++ipAddress[3] )
                printf( "%d.%d.%d.%d\n", ipAddress[0], ipAddress[1], ipAddress[2], ipAddress[3]);
}
else if(ipAddress[2] == 255) {
        for (ipAddress[2]=0; ipAddress[2] <= 255; ++ipAddress[2] )
            for (ipAddress[3]=0; ipAddress[3] <= 255; ++ipAddress[3] )
                printf( "%d.%d.%d.%d\n", ipAddress[0], ipAddress[1], ipAddress[2], ipAddress[3]);
}
else if(ipAddress[3] == 255) {
            for (ipAddress[3]=0; ipAddress[3] <= 255; ++ipAddress[3] )
                printf( "%d.%d.%d.%d\n", ipAddress[0], ipAddress[1], ipAddress[2], ipAddress[3]);
}

- Обновление -

Спасибо и извините, что не сформулировали мой вопрос ясно.

Я пытаюсь сгенерировать список IP-адресов, основываясь на том, что (argv [1] входной IP-адрес) содержит где-нибудь 255, программа напечатает полный диапазон блоков IP, все возможные IP-адреса.

Работает нормально, но я просто хотел узнать и понять, можно ли написать это короче и эффективнее.

1 Ответ

0 голосов
/ 17 апреля 2019

Этот тип рекурсии является стандартным подходом, когда вам нужно запустить один и тот же цикл for на нескольких слоях.

void printAll(short ipAddress[], int index) {
    if (index == 4) {
        printf("%d.%d.%d.%d\n", ipAddress[0], ipAddress[1], ipAddress[2], ipAddress[3]);
        return;
    }
    for (int i = 0; i < 256; i++) {
        ipAddress[index] = i;
        printAll(ipAddress, index + 1);
    }

}

int main() {
    short ipAddress[4];
    ... // initialize
    for (int i = 0; i < 4; i++) {
        if (ipAddress[i] == 255) {
            printAll(ipAddress, i);
            break;
        }
    }
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...