PDA

Visualizza la versione completa : [C] Array di stringhe con indirizzi IP


artedelcorpo
31-12-2005, 15:48
Ciao ragazzi.

Dopo molto tempo lontano dal C mi sono rimesso ad utilizzarlo per
scrivere Plugin per altre piattaforme di sviluppo ma ho subito
incontrato un problema: voglio banalmente costruire un Array di
stringhe contenente un range di indirizzi IP (tipicamente da 1 a 255) a partire da un indirizzo IP passato alla funzione.

Più o meno in questo modo

Ammettiamo di passare l'indirizzo in questo modo
Local_Host_It = "192.168.1."


for ( i = 1, i < 255, i++) {

itoa( i, str, 10 );
strcpy( Local_Host_IP1, Local_Host_IP);
strcat( Local_Host_IP1, str );

Assegnando il valore di Local_Host_IP1 (formato da Local_Host_IP
+ ( 1 < i < 255 )) agli elementi di un array (o di una struttura, o di un Array costruito con le API della piattaforma per la quale sto scrivendo il Plugin) ottengo che yutti gli elementi dell'array hanno lo stesso valore: il valore che assume Local_Host_IP1
nell'ultimo ciclo. Essendo gli elementi dell'array (char *) puntantori alla variabile non mantengono il valore della stessa nel momento in cui gli viene assegnata.

}

1. Mi sono spiegato?
2. Come posso ovviare al problema?
3. Ho sbagliato completamente approccio?
4. Consigli?

Grazie

unomichisiada
31-12-2005, 18:11
Originariamente inviato da artedelcorpo
Ciao ragazzi.

Dopo molto tempo lontano dal C mi sono rimesso ad utilizzarlo per
scrivere Plugin per altre piattaforme di sviluppo ma ho subito
incontrato un problema: voglio banalmente costruire un Array di
stringhe contenente un range di indirizzi IP (tipicamente da 1 a 255) a partire da un indirizzo IP passato alla funzione.

Più o meno in questo modo

Ammettiamo di passare l'indirizzo in questo modo
Local_Host_It = "192.168.1."


for ( i = 1, i < 255, i++) {

itoa( i, str, 10 );
strcpy( Local_Host_IP1, Local_Host_IP);
strcat( Local_Host_IP1, str );

Assegnando il valore di Local_Host_IP1 (formato da Local_Host_IP
+ ( 1 < i < 255 )) agli elementi di un array (o di una struttura, o di un Array costruito con le API della piattaforma per la quale sto scrivendo il Plugin) ottengo che yutti gli elementi dell'array hanno lo stesso valore: il valore che assume Local_Host_IP1
nell'ultimo ciclo. Essendo gli elementi dell'array (char *) puntantori alla variabile non mantengono il valore della stessa nel momento in cui gli viene assegnata.

}

1. Mi sono spiegato?
2. Come posso ovviare al problema?
3. Ho sbagliato completamente approccio?
4. Consigli?

Grazie
1)Fai un esempio concreto di input ed output della funzione
2)Posta più codice

Ovviamente se ne riparla dopo capodanno :fighet: http://forum.html.it/forum/faccine/044.gif Buona anno! :zizi:

artedelcorpo
31-12-2005, 18:47
in realtà il problema può essere riassunto anche in modo più astratto: come popolare un array con valori stringa da "1" a "254"?

per quanto concerne il caso specifico invece...

l'input potrebbe essere "192.168.1." oppure "10.0.0."

e l'output dovrebbe essere qualcosa tipo

Ipotetico_Array[1] = "192.168.1.1"
Ipotetico_Array[2] = "192.168.1.2"
Ipotetico_Array[3] = "192.168.1.3"
...
Ipotetico_Array[255] = "192.168.1.255"

il codice non è molto più di questo (per il momento).
il resto delle righe sono le API della piattaforma per cui pluggo.
sto scrivendo una funzione complessa ma mi sono fermato subito con sta cosa delle stringhe/puntatori a stringhe.

questo è il comando per scrivere gli elementi dell'array
PA_SetStringInArray( Host_IP_Array, i, Local_Host_IP );
parametri
1 = PA_Variable Array
2 = int indice
3 = char* string

spero di essere stato più chiaro.

grazie di cuore e tantissimi auguri!!!

unomichisiada
01-01-2006, 16:01
#include <stdio.h>
#include <stdlib.h>
#include <string.h>



void PA_SetStringInArray( char** Host_IP_Array, int i, char* Local_Host_IP );
char** generateIPs(char* inputMask);

int main()
{
char* inputMask = "192.168.1.";
char **Host_IP_Array = generateIPs(inputMask);
int i;

for(i = 0; i < 256; i++)
printf("%s\n",Host_IP_Array[i]);
fflush(stdin);
getchar();
return 0;
}



char** generateIPs(char* inputMask)
{
int i;
char* str = (char*)malloc(4);
str[3] = '\0';
char* IP;
char** Host_IP_Array= (char**)malloc(256 * sizeof(char*));
for (i = 0 ; i < 256 ; i++ )
{
str = itoa(i,str,10);
IP = (char*)malloc(13);
IP[12] = '\0';
IP = strcpy(IP,inputMask);
strcat(IP,str);
Host_IP_Array[i] = IP;
}
return Host_IP_Array;
}


Ciao questo codice assume che tu gli passi un indirizzo base del tipo "192.168.1.", se cambi ovviamnete va in crash o sbaglia. Cioè non puoi passargli qualcosa come "192.168.1" o "192.168.1.2". Chiaramente si può migliorare molto, soprattutto per quanto riguarda i controlli d'errore.
Altre due osservazioni:
-Siccome non so che tipo sia PA_Variable l'ho semplicemente ignorato ed ho lavorato con doppi puntatori a stringa semplicemente, quindi non ho avuto nisogno di richiamare PA_SetStringInArray, eventualmente modifica il codice-
-Sei sicuro che i numeri che devi generare vadano da 1 a 254?Guarda che in un indirizzo IP valido ogni campo può avere valori da 0 a 255 (i valori codificabili con un byte).

artedelcorpo
01-01-2006, 17:51
Grazie mille per la risp e complimenti per il code.

I comandi PA_xxx fanno parte delle API dell'applicativo per il quale vado a scrivere il Plugin.

Mi sono limitato a 254 perchè devo ottenere delle info dai vai Host e quindi il 255 non mi serve.

Adatterò il code alla mia problematica e ti aggiornerò sugli esiti

Grazie ancora e buona serata!

unomichisiada
02-01-2006, 01:07
Originariamente inviato da artedelcorpo
Grazie mille per la risp e complimenti per il code.

I comandi PA_xxx fanno parte delle API dell'applicativo per il quale vado a scrivere il Plugin.

Mi sono limitato a 254 perchè devo ottenere delle info dai vai Host e quindi il 255 non mi serve.

Adatterò il code alla mia problematica e ti aggiornerò sugli esiti

Grazie ancora e buona serata!
Aggiungi anche le free per liberare la memoria che non guasta.

Loading