Ausgabe aller IP-Adressen

OP #6737437
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
Gast #6737456
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}`)
Gast #6737457
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 ;)
Gast #6737476
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öü
OP #6737486
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
Gast #6737533
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.
Gast #6737534
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
Gast #6737656
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.
#6737729
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
#6737764
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
}
Gast #6737997
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.
Gast #6738060
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.
Gast #6738439
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 ;-)
Gast #6738448
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren