Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » teil einer IP verändern

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
08.06.2004, 21:07 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


zu schreiben ist folgende funktion


C++:
#include <stdio.h>
#include <memory.h>
#include <string.h>

//t ist die teil zwischen zwei punkten der ersetzt werden soll... von 0 bis 3
//n ist die zahl die an die zu ersetzende stelle geschrieben werden soll...
//ip ist halt die ip in der die ersetzung vorgenommen werden soll

void replace_ip_part(int t,char*n,char ip[16]){// <-- Your part}

int main(){
char ip[16]= "192.168.70.1";
printf("%s\n",ip);    
replace_ip_part(0,"255",ip);
printf("%s\n",ip);
replace_ip_part(1,"255",ip);
printf("%s\n",ip);
replace_ip_part(2,"255",ip);
printf("%s\n",ip);
replace_ip_part(3,"255",ip);
printf("%s\n",ip);    
}


erlaubt sind nur die drei obigen header, von mir aus noch math.h...


folgendes beispiel würde folgende ausgabe erzeugen...
192.168.70.1
255.168.70.1
255.255.70.1
255.255.255.1
255.255.255.255

gewinnen tut wie immer die kürzeste Lösung (es zählt der code zwischen den geschweiften klammern)... hoffe das ist diesmal viele verschiedene kurze lösungen gibt und nicht am ende wieder alles auf die selbe lösung hinaus läuft...
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 08.06.2004 um 21:10 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.06.2004, 21:50 Uhr
(un)wissender
Niveauwart



C++:
#include <stdio.h>
#include <memory.h>
#include <string.h>
#include <string>

//t ist die teil zwischen zwei punkten der ersetzt werden soll... von 0 bis 3
//n ist die zahl die an die zu ersetzende stelle geschrieben werden soll...
//ip ist halt die ip in der die ersetzung vorgenommen werden soll

void replace_ip_part(int t,char*n,char ip[16]);

int main(){
    char ip[16]= "192.168.70.1";
    printf("%s\n",ip);    
    replace_ip_part(0,"255",ip);
    printf("%s\n",ip);
    replace_ip_part(1,"255",ip);
    printf("%s\n",ip);
    replace_ip_part(2,"255",ip);
    printf("%s\n",ip);
    replace_ip_part(3,"255",ip);
    printf("%s\n",ip);
    return 0;  
}

void replace_ip_part(int t,char*n,char ip[16])
{
    std::string tempIp = ip;
    int index, index2;
    switch(t)
    {
        case 0:
            tempIp.erase(0, tempIp.find("."));
            tempIp.insert(0, n);            
            break;
        case 1:
            index = tempIp.find(".") + 1;                    
            tempIp.erase(index, tempIp.find(".", index) - index);          
            tempIp.insert(index, n);
            break;
        case 2:
            index = tempIp.find_last_of(".") - 1;  
            index2 = tempIp.find(".", index - 3) + 1;                  
            tempIp.erase(index2, index - index2 + 1);    
            tempIp.insert(index2, n);
            break;
        case 3:
            index = tempIp.find_last_of(".") + 1;
            tempIp.erase(index, tempIp.size() - index);
            tempIp.insert(index, n);
            break;
    }
    
    strcpy(ip, tempIp.c_str());
}



Bearbeitung:

Arg, erlaubt sind nur obige Header, mist, also vergesst es, vielleicht mache ich noch eine andere Lösung.


--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 08.06.2004 um 21:51 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.06.2004, 21:54 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ich wollte dich gerade rund machen aber du hast es ja selber noch gemerkt...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.06.2004, 22:50 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hmm mal schauen, so kurz "from scratch":


C++:
#include <stdio.h>
#include <memory.h>
#include <string.h>

void replace_ip_part(int t,char*n,char ip[16]);

int main(){
  char ip[16]= "192.168.70.1";

  printf("Part 255.xxx.xxx.xxx: %s - ",ip);    
  replace_ip_part(0,"255",ip);
  
  printf("Part xxx.255.xxx.xxx: %s - ",ip);
  replace_ip_part(1,"255",ip);

  printf("Part xxx.xxx.255.xxx: %s - ",ip);
  replace_ip_part(2,"255",ip);

  printf("Part xxx.xxx.xxx.255: %s - ",ip);
  replace_ip_part(3,"255",ip);
}

void replace_ip_part(int t,char*n,char ip[16])
{
  char nip[16];
  int f,x,y;
  for(f=0,x=0,y=0; x < 16; x++)
  {
    if(ip[x]=='.')
      f++;
    if(f==t)
    {
      x++;
      if(f>0)
        nip[y++]='.';
      memcpy(&nip[y],n,strlen(n));
      while(ip[x++] != '.');
      x-=2;
      y+=strlen(n);
      f=-4;
    }
    else
      nip[y++]=ip[x];
  }
  printf("%s\n",nip);
}



Ich frag mich im Moment nur noch was einem an Ende die geänderte IP nützt, da man die geänderte ip ja nicht mehr zurückgeliefert bekommt.

Naja ich hab nun hoffentlich keine fehler gebaut, habs nicht getestet, nur durch den "OnBoard-Compiler" (d.h Kopf) gejagt...


Bearbeitung:

Hab da noch einige Fehler drin...




Bearbeitung von 2:

ok ist nun korrigiert



Ausgabe ist nun z.b:


Code:
Part 255.xxx.xxx.xxx: 192.168.70.1 - 255.168.70.1
Part xxx.255.xxx.xxx: 192.168.70.1 - 192.255.70.1
Part xxx.xxx.255.xxx: 192.168.70.1 - 192.168.255.1
Part xxx.xxx.xxx.255: 192.168.70.1 - 192.168.70.255


--
class God : public ChuckNorris { };

Dieser Post wurde am 08.06.2004 um 23:11 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.06.2004, 23:30 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


also wenn ich deinen code ausführe schmiert der bei mir ab... also schon mal nicht so gut...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.06.2004, 00:07 Uhr
(un)wissender
Niveauwart


Das ist richtig dreckig, sollte aber funzen.


C++:
#include <stdio.h>
#include <memory.h>
#include <string.h>

//t ist die teil zwischen zwei punkten der ersetzt werden soll... von 0 bis 3
//n ist die zahl die an die zu ersetzende stelle geschrieben werden soll...
//ip ist halt die ip in der die ersetzung vorgenommen werden soll

void replace_ip_part(int t,char*n,char ip[16]);

int main(){
    char ip[16]= "192.168.70.1";
    printf("%s\n",ip);    
    replace_ip_part(0,"255",ip);
    printf("%s\n",ip);
    replace_ip_part(1,"255",ip);
    printf("%s\n",ip);
    replace_ip_part(2,"255",ip);
    printf("%s\n",ip);
    replace_ip_part(3,"255",ip);
    printf("%s\n",ip);
    return 0;  
}

void replace_ip_part(int t,char*n,char ip[16])
{
    char buf[16];
    int i,j;
    for(i = 0, j = 0; j != t; ++i )
    {        
        if(ip[i] == '.') ++j;      
        buf[i] = ip[i];      
    }  
    j = strlen(n);
    memcpy(buf + i, n, j * sizeof(char));
    j += ++i;
    
    if(t < 3)
    {
        *(buf + j - 1) = '.';
        while(ip[i++] != '.');
    }
    
    while(*(ip + i))
    {
        buf[j++] = ip[i++];
    }
    buf[j] = 0;
    
    strcpy(ip, buf);
}



Bearbeitung:

Fehler korrigiert.


--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 09.06.2004 um 00:19 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.06.2004, 01:28 Uhr
0xdeadbeef
Gott
(Operator)



C++:
void replace_ip_part(int t,char*n,char ip[16]){
  int a[4];
  sscanf(ip,"%d.%d.%d.%d",a,a+1,a+2,a+3);
  a[t]=atoi(n);
  sprintf(ip,"%d.%d.%d.%d",*a,a[1],a[2],a[3]);
}


Newlines und spaces rausgenommen, sind das 106 zwischen den Klammern. Und es scheint mir der natürlichste ansatz zu sein. Ich wollte ja erst ne rekursive Lösung bauen, aber wegen des (selten dämlich gewählten ) Funktionsnamens bringt das nichts.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 09.06.2004 um 01:39 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
09.06.2004, 09:05 Uhr
(un)wissender
Niveauwart


Wow, tolle Lösung!
Sehr intuitiv und ich bin doch nicht drauf gekommen.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
09.06.2004, 11:28 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


verdammte sch***...
warum bin ich auf das offensichtliche nicht selber drauf gekommen...
ich hatte gestern nacht mit sowas angefangen...

C++:
void replace_ip_part(int t,char*n,char ip[16]){
char *p,*q;
for(p=ip;*p&&t;*p++)*p-46?0:--t;
for(q=p;*++q&&*q-46;);
memmove(q+strlen(n)-(q-p),q,strlen(q) );
for(;*n;*p++=*n++);
}


und das dumme daran ist das fuktioniert noch nicht mal richtig, weil ich am ende nochmal checken muss ob ich das nullbyte verschieben muss und das kostet auch wieder viele zeichen...
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 09.06.2004 um 11:30 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
09.06.2004, 11:40 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


übrigens ein kleines manko hat deine lösung beefy... atoi.. dafür brauchst du stdlib.h
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: