Forum: Mikrocontroller und Digitale Elektronik Ausgabe aller IP-Adressen


von Vaniko 9. (vaniko_9)


Lesenswert?

Hallo,

Beispiel: Nutzer hat in eine C++ Programm 3 mal verschiede IP-Adressen 
eingegeben Bsp.:
172.12.15.2 ;
185.3.5.1 ;
195.36.47.5

und wäre es möglich nach der Eingabe eine Ausgabe aller IP-Adressen 
anzuzeigen, also ich gebe 3 mal verschiede IP-Adressen ein und dann will 
ich was ich eingegeben habe angezeigt werden nach Reihenfolge.

Ist es möglich so eine Programm zu machen?

Wenn Ja könnt ihr mir kurz sagen wie es gehen würde

von Programmierer (Gast)


Lesenswert?

Ja.

von Experte (Gast)


Lesenswert?

Vaniko 9. schrieb:
> Ist es möglich so eine Programm zu machen?

Ja, ist kein Problem.


> Wenn Ja könnt ihr mir kurz sagen wie es gehen würde
1
for (let a = 0; a <= 255; a++)
2
for (let b = 0; b <= 255; b++)
3
for (let c = 0; c <= 255; c++)
4
for (let d = 0; d <= 255; d++)
5
console.log(`${a}.${b}.${c}.${d}`)

von Schlaumaier (Gast)


Lesenswert?

Bubblesort wenns nicht genau sein soll.

Ansonsten in eine Array auflösen, bubblesort und dann wieder 
zusammenfügen. ;)

Ich mag bubblesort. Ist die einzige Sortierung die ich auswendig kann ;)

von Programmierer (Gast)


Lesenswert?

Vaniko 9. schrieb:
> Ist es möglich so eine Programm zu machen?

Hast du schon einen Quellcode entwickelt? Wenn ja, stell ihn hier mal 
rein,dann kann ich ihn anschauen und dir vielleicht Tipps geben.

von Harry L. (mysth)


Lesenswert?

Heute ist doch erst Donnerstag.....

von Schlaumaier (Gast)


Lesenswert?

Harry L. schrieb:
> Heute ist doch erst Donnerstag.....

Die 58 Min. noch.  Sei nicht so kleinlich. ;)

von Meisterprogrammierer (Gast)


Lesenswert?

Schlaumaier schrieb:
> Bubblesort wenns nicht genau sein soll.

Bubblesort ist ein sehr veralteter Algorithmus, der in den 80er Jahren 
entwickelt wurde.

Besser sind Verfahren wie Quicksort oder eine lineare Liste.

von Experte (Gast)


Lesenswert?

Schlaumaier schrieb:
> Bubblesort wenns nicht genau sein soll.

Hmm:
1
const post = Array.from(`Bubblesort wenns nicht genau sein soll.
2
3
Ansonsten in eine Array auflösen, bubblesort und dann wieder
4
zusammenfügen. ;)
5
6
Ich mag bubblesort. Ist die einzige Sortierung die ich auswendig kann ;)`);
7
8
console.log(post.sort().join(""));

Ergibt (ohne Whitespace, kann das Forum nicht gut):
1
)),...;;AABIISaaaaaaaabbbbbbbbcccddddddeeeeeeeeeeeeeeeeeeeeffgggggghhhiiiiiiiiiiiikllllllmmmnnnnnnnnnnnnnnnnnnnnnoooooorrrrrrrrsssssssssssstttttttuuuuuuuuuwwwyzzöü

von user (Gast)


Lesenswert?

nix geht über LSD-Radix-Sort

von Meisterprogrammierer (Gast)


Lesenswert?

Experte schrieb:
> Ergibt (ohne Whitespace, kann das Forum nicht gut):

Was sind Whitespaces?

von Experte (Gast)


Lesenswert?

Meisterprogrammierer schrieb:
> Was sind Whitespaces?

Im Darkmode der schwarze Platz.

von Vaniko 9. (vaniko_9)


Lesenswert?

Programmierer schrieb:
> Vaniko 9. schrieb:
>> Ist es möglich so eine Programm zu machen?
>
> Hast du schon einen Quellcode entwickelt? Wenn ja, stell ihn hier mal
> rein,dann kann ich ihn anschauen und dir vielleicht Tipps geben.


also ich habe so etwas gemacht:
1
#include <regex>
2
3
#include <iostream>
4
5
#include <string>
6
7
#include <array>
8
9
using namespace std;
10
11
int main() 
12
{
13
    auto re_ipv4 = std::regex(R"""((?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})))""");
14
15
    cout << " \n\n Verwaltung von IP-Adressen \n\n";
16
17
    std::cout << "Bitte IP-Adresse eingeben:\n";
18
19
    string s;
20
21
    while (std::getline(std::cin, s)) {
22
        if (std::regex_match(s, re_ipv4))
23
            cout << "Ihre IP-Adresse wurde Ueberprueft\n" << "Ihre IP-Adresse ist Gueltig\n";
24
        else
25
            cout << "Ihre IP-Adresse ist Ungueltig\n";
26
        cout << "Eine weitere IP-Adresse eingeben\n";
27
        break;
28
29
    }
30
31
    {  
32
        auto re_ipv4 = std::regex(R"""((?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})))""");
33
    
34
        string s;
35
36
        while (std::getline(std::cin, s)) {
37
            if (std::regex_match(s, re_ipv4))
38
                cout << "Ihre IP-Adresse wurde Ueberprueft\n" << "Ihre IP-Adresse ist Gueltig\n" << "Eine weitere IP-Adresse eingeben\n";
39
            else
40
                cout << "Ihre IP-Adresse ist Ungueltig\n";
41
                break;
42
                
43
        }
44
    }
45
    
46
    {  
47
        auto re_ipv4 = std::regex(R"""((?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})))""");
48
        
49
        string s;
50
51
        while (std::getline(std::cin, s)) {
52
            if (std::regex_match(s, re_ipv4))
53
                cout << "Ihre IP-Adresse wurde Ueberprueft\n" << "Ihre IP-Adresse ist Gueltig\n";
54
            else
55
                cout << "Ihre IP-Adresse ist Ungueltig\n";
56
                break;
57
                
58
        }
59
    }
60
    
61
   
62
    cout << "Das Programm ist abgeschlossen.\n";
63
    return 0;
64
}

Hier am ende will ich diese IP-Adressen die ich eingegeben habe 
angezeigt bekommen

von Schlaumaier (Gast)


Lesenswert?

Ich weiß das  bubblesort aus die 80er ist, aber für die paar Adressen 
ist das schnell genug.

Deshalb würde ich nach der Eingabe einfach die IP-Adressen mit 0 
auffüllen, damit sich 3er Gruppen bilden. z.b. 192.002.120.020

Dadurch sind alle Probleme der Sortierroutine beseitigt.

Um doppelte Eingaben zu verhindern einfach die "aufgefüllte" IP-Adresse 
dann mit den Array vergleichen und wenn nicht vorhanden den Array 
hinzufügen.

Sortieren und fertig

Danach kann der User damit machen was er will.

von Schlaumaier (Gast)


Lesenswert?

Nachtrag :

Ein Bereich kann man nach der Auffüllung mit größer / kleiner String 
blockieren wenn man das will.

fehler = false
If neue_ip > "192.168.000.000" and <- "192.168.255.255" then
 Fehler = true
end if

von Dirk B. (dirkb2)


Lesenswert?

Schlaumaier schrieb:
> Deshalb würde ich nach der Eingabe einfach die IP-Adressen mit 0
> auffüllen, damit sich 3er Gruppen bilden. z.b. 192.002.120.020

Und dann macht die spätere Umwandlung daraus Oktalzahlen (führende 0)

von Martin (Gast)


Lesenswert?

Die IPs in uint32 umwandeln, dann ist das sortieren einfacher und 
schneller.

von Stefan F. (Gast)


Lesenswert?

Wenn man schon C++ verwendet, sollte man dann nicht auch die zugehörige 
Standard Bibliothek (oder eine andere) verwenden, um das Rad (den 
Sortier-Algorithmus) nicht neu zu erfinden?

"was ich eingegeben habe angezeigt werden nach Reihenfolge" habe ich 
allerdings so interpretiert, dass er die Ausgabe in der gleichen 
Reihenfolge haben will, wie die Eingabe statt fand.

von Gerald K. (geku)


Lesenswert?

Martin schrieb:
> Die IPs in uint32 umwandeln, dann ist das sortieren einfacher und
> schneller.
1
#include <sys/socket.h> 
2
#include <netinet/in.h> 
3
#include <arpa/inet.h> 
4
5
in_addr_t inet_addr( const char * cp );
sortieren
und wieder retour:
1
#include <sys/socket.h> 
2
#include <netinet/in.h> 
3
#include <arpa/inet.h> 
4
5
char * inet_ntoa( struct in_addr in );

Beispiel:
1
struct in_addr s; s.s_addr = 16777343; // 127.0.0.1 als int 
2
printf("IP-Adresse schoen formatiert: %s\n", inet_ntoa(s));

http://www.qnx.com/developers/docs/qnx_4.25_docs/tcpip50/prog_guide/libs/inet_addr.html

http://www.qnx.com/developers/docs/qnx_4.25_docs/tcpip50/prog_guide/libraries.html

von zonk (Gast)


Lesenswert?

Schlaumaier schrieb:
> Ich weiß das  bubblesort aus die 80er ist, aber für die paar Adressen
> ist das schnell genug.

eher 60er. Das sagt aber nix aus, das sind sie nämlich alle;)

von Daniel A. (daniel-a)


Lesenswert?

Das hier geht mit Domains, IPv4 & IPv6, auf unixoiden Systemen. 
Inklusive Namensauflösung, und reines C.
1
#define _DEFAULT_SOURCE
2
#include <sys/types.h>
3
#include <sys/socket.h>
4
#include <netdb.h>
5
#include <stdio.h>
6
#include <stdlib.h>
7
#include <string.h>
8
#include <assert.h>
9
#include <stdbool.h>
10
11
struct my_addr_entry {
12
  struct addrinfo* info;
13
};
14
15
struct addr_list {
16
  size_t count, size;
17
  struct my_addr_entry* list;
18
};
19
20
bool addr_list_add(struct addr_list* list, const struct my_addr_entry* entry){
21
  size_t count = list->count + 1;
22
  if(count > list->size){
23
    size_t new_size = list->size ? list->size * 2 : 1; // Size doubling strategy, to reduce number of reallocs needed
24
    assert(count <= new_size);
25
    struct my_addr_entry* ptr = realloc(list->list, sizeof(*list->list) * new_size);
26
    if(!ptr)
27
      return false;
28
    list->list = ptr;
29
    list->size = new_size;
30
  }
31
  list->list[count-1] = *entry;
32
  list->count = count;
33
  return true;
34
}
35
36
int main(){
37
  char input[256];
38
  struct addr_list list = {0};
39
40
  while(fgets(input,sizeof(input),stdin)){
41
    if(!strcmp(input,"\n"))
42
      break;
43
    if(input[strlen(input)-1]=='\n')
44
      input[strlen(input)-1] = 0;
45
46
    struct addrinfo* result = 0;
47
    int ret = getaddrinfo(input, 0, &(struct addrinfo){.ai_flags=AI_CANONNAME, .ai_socktype=SOCK_STREAM}, &result);
48
    if(ret){
49
      fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret));
50
      continue;
51
    }
52
53
    struct my_addr_entry entry = {
54
      .info = result
55
    };
56
    if(!addr_list_add(&list, &entry)){
57
      perror("addr_list_add failed");
58
      freeaddrinfo(result);
59
      break;
60
    }
61
  }
62
63
  for(size_t i=0,n=list.count; i<n; i++){
64
    struct my_addr_entry* entry = &list.list[i];
65
    printf("%s", entry->info->ai_canonname);
66
    for(struct addrinfo* rp = entry->info; rp != NULL; rp = rp->ai_next){
67
      char hbuf[NI_MAXHOST];
68
      if(getnameinfo(rp->ai_addr, rp->ai_addrlen, hbuf, sizeof(hbuf), 0, 0, NI_NUMERICHOST) == 0)
69
        printf(" %s", hbuf);
70
    }
71
    puts("");
72
  }
73
74
  for(size_t i=0,n=list.count; i<n; i++){
75
    struct my_addr_entry* entry = &list.list[i];
76
    freeaddrinfo(entry->info);
77
  }
78
  free(list.list);
79
  memset(&list,0,sizeof(list));
80
81
  return 0;
82
}

von Schlaumaier (Gast)


Lesenswert?

Aufgabenstellung im ersten Beitrag des TO.

Vaniko 9. schrieb:
> also ich gebe 3 mal verschiede IP-Adressen ein und dann will
> ich was ich eingegeben habe angezeigt werden nach Reihenfolge.

Und genau DAFÜR ist meine Lösung perfekt.

Der Rest ist Beilage, auch wenn ich zugegen muss das die Beilage sehr 
lecker sein kann.

von Daniel A. (daniel-a)


Lesenswert?

Da steht übrigens nichts von sortieren. Ich gehe daher davon aus, dass 
die Eingabereihenfolge gemeint ist. Damit wäre sortieren dann genau 
falsch.

von Schlaumaier (Gast)


Lesenswert?

Daniel A. schrieb:
> Da steht übrigens nichts von sortieren. Ich gehe daher davon aus,
> dass
> die Eingabereihenfolge gemeint ist. Damit wäre sortieren dann genau
> falsch.

Hm, der Text des TO ist ungenau.

Weil ich unter Reihenfolge grundsätzlich sortieren verstehe, anders als 
bei den Wort EINGABEreihenfolge.  Dann würde ich niemals an sortieren 
denken.

von Martin (Gast)


Lesenswert?

Schlaumaier schrieb:
> Weil ich unter Reihenfolge grundsätzlich sortieren verstehe, anders als
> bei den Wort EINGABEreihenfolge.  Dann würde ich niemals an sortieren
> denken.


offtopic

Das wäre doch lustig, einen 10 Seiten Text eingeben und dann die Wörter 
sortieren. Ließt sich bestimmt super der Text ;-)

von Stefan F. (Gast)


Lesenswert?

Schlaumaier schrieb:
> Weil ich unter Reihenfolge grundsätzlich sortieren verstehe, anders als
> bei den Wort EINGABEreihenfolge.  Dann würde ich niemals an sortieren
> denken.

An der Kasse im Penny werden die Kunden auch in der Reihenfolge bedient. 
Aber ganz sicher nicht sortiert. Das gäbe einen Auflauf!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.