Zum Inhalt springen

Problem mit der Stringzerlegung in "C"


Dukanos

Empfohlene Beiträge

Hallo zusammen,

gleich mal vorne weg, die Suchfunktion hat nichts ergeben, also steinigt mich nicht gleich, weil ich euch mit sowas vermeidlich simplen langweile ^^

Ich habe das Problem, dass ich 2 zahlen in einer Zeile einlesen soll.

Also z.B. "100 200" dumm nur, dass es nicht so ganz hinhaut.

Ich hab hier mal das stück des codes, welches das erledigen sollte.

Bin ich nur zu blind oder wo is der fehler?

------

int main(void)

{

int zahl, zahlu, zahlo;

int n, i;

char s[100], x[100], y[100];

printf("Geben sie 2 Zahlen ein: \n");

gets(s);

i=0;

/*schleife um die ganze Laenge des Strings zu durchlaufen*/

while(i<= strlen(s))

{

/*schleife solange s an der Stelle i eine Zahl ist*/

if(isdigit(s))

{

strcpy(x, s);

}

else

{

while(s != isdigit(s))

{

i++;

}

strcpy(y, s);

}

i++;

}

printf("%c", x);

printf("%c", y);

-------

danke schonmal!

Gruß Dukanos

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zu der Sache mit "gets", dessen bin ich mir bewusst, aber mir wurde es in diesem Fall empfohlen, weil scanf auch nicht das gelbe vom Ei wäre :-)

char *strcpy(char *deststr, char *srcstr);

ich hab mir auch schon überlegt anstatt strcpy einfach nur direkt x = s zu schreiben... dann gibts keine warnungen mehr, allerdings funktionierts immer noch nicht.

Ich versuche aus dem eingegebnen string s[], die beiden zahlen herauszufiltern.

Zahl 1 soll in x[] gespeichert werden und zahl 2 in x[]

und im anschluss sollen sie noch ausgegeben werden.

Über Fehleingaben mach ich mir später noch Sorgen :-)

(Im späteren verlauf des programms sollen die beiden zahlen die ober- und untergrenze eines Zahlenbereichs angeben bei dem dann jede zahl in seine Primfaktoren zerlegt wird... aber das hat hiermit eigentlich nichts zu tun)

Von der Logik her gibt doch die erste while-schleife an, dass er s[] in seiner kompletten länge durchläuft.

Dann wird geprüft, ob es sich bei der ersten stelle um eine zahl handelt, wenn ja, dann kopiert er die zahl an der stelle s nach x ansonsten.

Dann "else" und die 2te while-schleife:

sobald er keine zahl mehr findet soll er den s[] so lange durchlaufen, bis wieder eine zahl kommt und die speichert er dann nach y[]

---

habt ihr spontan ne bessere idee wie man´s machen könnte?

Link zu diesem Kommentar
Auf anderen Seiten teilen

aso,....

jetzt raff ich erst mal was du willst.

hintereinander zwei zahlen eingeben mit einem trennzeichen und dann beide zahlen seperat abspeichern.

leg mal bitte ein bestimmtes trennzeichen fest. dann ist das auch nicht so schwer.

kannst ruhig mit scanf arbeiten.

- speicherst die eingabe in einen char[] ab.

- benutzt die funktion "strtok()" und gibst da dein trennzeichen ein, um die beiden zahlen auseinander zu bekommen und speicherst jede zahl in ein seperaten char[] ab

- dann kannst du dir mit der funktion "atoi()" die zahlen, die momentan noch als char gespeichert sind, als int zurückgeben lassn und in ein int speichern

Link zu diesem Kommentar
Auf anderen Seiten teilen

#include <stdio.h>

#include <string.h> /* benötigt für strcpy */

#include <stdlib.h> /* benötigt für atoi */

#define TRENNZEICHEN ";" /* define um das trennzeichen zu ändern, einfach was in den anführungsstrichen steht

ersetzen um ein anderes trennzeichen zu benutzen (können auch mehrere sein) */

int main(void){

int iZahl1, iZahl2;

char sEingabe[100], sZahl1[100], sZahl2[100];

char *token;

printf("Bitte geben Sie 2 Zahlen mit \";\" getrennt ein:");

fflush(stdin); /* löscht den tastaturpuffer */

gets(sEingabe); /* eingabe der zahlen als CHAR */

token = strtok(sEingabe, TRENNZEICHEN); /* hier sucht man nach dem trennzeichen und kopiert den string bis zum ... */

strcpy(sZahl1, token); /* ... trennzeichen in ein anderen char[] */

token = strtok(NULL, TRENNZEICHEN); /* hier wieder suchen ... (NULL bedeutet, dass er vom letzten token ... */

strcpy(sZahl2, token); /* ... weiter macht) */

iZahl1 = atoi(sZahl1); /* hier die zahl, die in sZahl1 enthalten ist, in ein integer speichern */

iZahl2 = atoi(sZahl2);

printf("%d\n", iZahl1); /* ausgabe */

printf("%d\n", iZahl2);

}

ist jetzt hier leider nicht richtig formatier, aber so funzt es auf jeden fall!

viel spaß!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

Zu der Sache mit "gets", dessen bin ich mir bewusst, aber mir wurde es in diesem Fall empfohlen, weil scanf auch nicht das gelbe vom Ei wäre :-)

Die Alternative zu gets heisst ja auch nicht scanf, sondern fgets():

BUGS

Never use gets(). Because it is impossible to tell without knowing the

data in advance how many characters gets() will read, and because

gets() will continue to store characters past the end of the buffer, it

is extremely dangerous to use. It has been used to break computer

security. Use fgets() instead.

In meiner man-Page zu strtok steht Folgendes:

BUGS

Never use these functions. If you do, note that:

These functions modify their first argument.

These functions cannot be used on constant strings.

The identity of the delimiting character is lost.

The strtok() function uses a static buffer while parsing, so

it's not thread safe. Use strtok_r() if this matters to you.

Nur so als Hinweis. Ich denke es wäre schon besser, sich seine eigene Trennfunktion zu schreiben.

Diese Konstrukt...


 fflush(stdin); 

...erzeugt undefiniertes Verhalten:

http://www.c-plusplus.de/forum/viewtopic-var-t-is-39349.html

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

@ carstenj

wenn dass so ist, kann man ja fast keine funktion mehr benutzen.... ;)

ich sag mal, für den hausgebrauch und kleinere sachen wirds schon funktionieren....

Natürlich ist es ein Unterschied, ob man eine Businessapplication schreibt, oder für den Hausgebrauch ein wenig rumfrickelt. Es muss natürlich jeder für sich selbst entscheiden, ob er sich an bestimmte Konvention hält oder nicht. Nur wird die Fehlersuche bei größeren Programmen nicht gerade leichter.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...