# Nutzung von sscanf()



## MLelite (27. Januar 2006)

hi,


```
int port;
    char ip[20];
    char buffer[100];  

printf("Ip address: ");
scanf ("%s",&buffer);          //user Eingabe: buffer="192.168.1.100:8050";
sscanf (buffer,"%s:%d",&ip,&port);
printf("Ip address: '%s'   '%d'",ip,port);
```
Mein Problem liegt darin, dass der string nicht aufgeteilt wird. Er soll aus der user Eingabe siehe oben ^ ^ einfach nur ip="192.168.1.100"; und port="8050"; aufteilen
Der code geht aber nicht, an was koennte es liegen?


----------



## deepthroat (27. Januar 2006)

Hi.

Das liegt daran, das %s im Format immer bis zum Zeilenende (bzw. Ende d. Strings liest) - damit ist der gesamte String in IP drin und der Rest kann nicht mehr gescannt werden (scanf liefert also 1 zurück, oder?).

Besser du nimmst einfach die Funktion char* strrchr(const char* str, char c). Die Funktion sucht nach einem Zeichen vom Ende des Strings angefangen und liefert die Position im String zurück wo es gefunden wurde. Dann könntest du z.B. dieses Zeichen durch ein '\0' ersetzen und eine Position weiter gehen. Dann kannst du immer den Port als Zahl einlesen und den Rest kannst du so lassen - da hast du z.B. auch Speicher gespart.

Gruß


----------



## MLelite (27. Januar 2006)

/danke fuer deine Antwort
da muss man dann eine constante angeben, ich komm da nicht ganz so durch mit der funktion denn es handelt um eine EIngabe die kann ja dann nicht in eine constante gespeichert werden...

```
int pos;
char buffer[20];
scanf ("%s",&buffer);
pos = strrchr(buffer, ':');
```

was waere dann die Funktion zum rauskopieren von der pos bis zum Ende


----------



## deepthroat (27. Januar 2006)

Nein, da muß man keine Konstante angeben. Du Funktion hat lediglich einen konstanten Parameter, was bedeutet, das innerhalb der Funktion nichts an der Eingabe also dem konst. Parameter gändert wird.


```
char* eingabe = "102.394.394.34:49";

char* port = strrchr(eingabe, ':');
if (port != NULL) { /* Suche war erfolgreich, d.h. es ist ein Doppelpunkt drin. */
  *(port++) = '\0'; /* Doppelpunkt durch String-Terminierungszeichen ersetzen */
  printf ("IP: %s; PORT: %s", eingabe, port);
}
```
Wie du siehst brauchst du keine Funktion zum Ausgeben ab einer bestimmten Stelle, da C-String von vornherein nur Pionter sind und der Anfang eben dadurch festgelegt wird wo sie hinzeigen.

Gruß


----------



## Matthias Reitinger (27. Januar 2006)

Folgendes würde auch funktionieren:

```
int iPort;
char szAddress[20];
    
printf("Ip address: ");
scanf ("%19[^:]:%d", &szAddress, &iPort);
printf("Ip address: '%s'   '%d'", szAddress, iPort);
```

PS: Hab die letzte Zeile des Quellcodes nochmal editiert. Da war ein unsinniges Und-Zeichen.


----------



## MLelite (27. Januar 2006)

mist kriege den port bei denem beispiel nicht in die var werd am montag weiter schauen danke fuer die hilfe.


----------



## deepthroat (27. Januar 2006)

Matthias Reitinger hat gesagt.:
			
		

> Folgendes würde auch funktionieren:
> 
> ```
> printf("Ip address: ");
> ...


Verdammt, das war eigentlich auch meine erste Idee - allerdings hab ich den Formatstring verhau'n weil ich dachte da muß noch ein 's' (für String) hinter die eckigen Klammern. Beim Testen hat's dann natürlich nicht geklappt. Peinlich, peinlich....

Gruß

PS: Der neue Look gefällt mir. Cool. ;-)


----------



## MLelite (30. Januar 2006)

es geht was wohl jetzt auch zu erwarten ist, Danke euch beiden.


----------

