#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;
}