Кратно для циклов в зависимости от условий

#c #for-loop

#c #for-цикл

Вопрос:

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

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

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

Спасибо.

    short ipAddress[4];

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



printf("nIp Address: d. d. d. dn",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.%dn", 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.%dn", 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.%dn", 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.%dn", ipAddress[0], ipAddress[1], ipAddress[2], ipAddress[3]);
}
 

—Обновить—

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

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

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

Комментарии:

1. Несмотря на неправильный спецификатор формата, вы намеревались, чтобы первое условие печатало 4,2 миллиарда IP-адресов, второе 16,7 миллиона, третье 64 КБ и четвертое 255? Rly ? Во-вторых, codereview.stackexchange.com кажется более подходящим для этого.

2. Ваш ipAddress не инициализирован. Никто не знает, что if произойдет (скорее всего, ни один из них). The code basically detects xxx in ipAddress[0-4] and then prints the block ips. — не могли бы вы уточнить?

3. Эй, этот вопрос немного неоднозначен по своей природе, неясно, что именно вы спрашиваете. В идеале не нужно было бы читать ваш код, чтобы понять вашу проблему. Если бы вы могли более точно описать, что вы пытаетесь сделать, я был бы рад помочь.

4. @dyukha Я думаю, что он использует предположение, что все они инициализированы в 0, поскольку это поведение используется большинством систем времени выполнения.

5. Будьте осторожны с рекурсивными функциями и несколькими уровнями рекурсии. Ваш наихудший случай 256^4 (то есть 4294967296 рекурсивных вызовов, каждый из которых требует настройки собственного стека функций)

Ответ №1:

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

 void printAll(short ipAddress[], int index) {
    if (index == 4) {
        printf("%d.%d.%d.%dn", 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;
}