Zeiger

Post Reply
Message
Author
john

Zeiger

#1 Post by john »

Hallo,

sagen wir mal ich möchte das erste Wort eines Strings ermitteln.

#include <stdio.h>

#define MAX 64

main ()
{
char str[MAX] = "Hello World";
char wort[MAX];
char *p, *bla;
p = str;
bla = wort;
while (*p && *p != ' ')
{
*bla++ = *p;
*p++;
}
*bla++ = 0;
printf ("das erste Wort: %s
", wort);
}

Wäre doch eine Möglichkeit?
Ich finde dies aber ein wenig umständlich.
Wie speicher ich nun in *bla alles bis
zum ersten Leerzeichen (' ') ab? Ich möchte es am Ende ungefähr so ausgeben:
printf("erste Wort = %s
", bla);
Es soll nicht erst ein Zeiger auf wort[MAX] gesetzt werden. Geht das?
Und wenn ja, wie? Über ein Beispiel wäre ich sehr
dankbar.

john

Tom

Re: Zeiger

#2 Post by Tom »

vielleicht mit strtok

john

Re: Zeiger

#3 Post by john »

eigentlich wollte ich wissen ob ich die Sache mit dem Zeiger richtig sehen!?

klar würde es mit strtok() gehen, nur meine Frage war anders <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">
Trotzdem danke für die Antwort.

rattengift

Re: Zeiger

#4 Post by rattengift »

also du willst es "zur übung" von hand programmieren, richtig? anstatt die pointer zu inkrementieren kannst du einen index verwenden:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">#include <stdio.h>
#define MAX 64

main ()
{
char str[MAX] = "Hello World";
char wort[MAX];
int j = 0;

while (str[j] != ' ')
wort[j] = str[j++];

wort [j] = '\0';
printf ("das erste Wort: %s ", wort);
}</font><hr></pre></blockquote>

rattengift

Re: Zeiger

#5 Post by rattengift »

oder wenn du eben doch mit pointern rechnen willst, müsste das in etwa so gehen:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">...
main ()
{
char str[MAX] = "Hello World";
char wort[MAX];

while (*str != ' ')
*wort++ = *str++;

*wort = '\0';
printf ("das erste Wort: %s ", wort);
}</font><hr></pre></blockquote>die while-loop kann man (wenn man will) auch noch kompakter formulieren: while ((*wort++ = *str++) != ' ');

rattengift

Re: Zeiger

#6 Post by rattengift »

oops, das 2te bsp geht so natürlich nicht, da die referenz auf den wortanfang verloren geht (die muss man sich natürlich merken, wie du es auch gemacht hast).
ausserdem sollte in beiden beispielen in die while-bedingung die prüfung auf 0 (die du ja richtig verwendet hast) auch noch mit rein.
naja, ich denk das prinzip ist jedenfalls klargeworden.

Udo Kanter

Re: Zeiger

#7 Post by Udo Kanter »

Prinzip ist klar.

6 Zeilen Code und 2 Segfaults. C ist echt geil.

rattengift

Re: Zeiger

#8 Post by rattengift »

hey, nett dass du meine bugs C in die schuhe schiebst anstatt mir.
ich bin zwar auch kein c-fan bin, aber hier war wohl nicht C schuld. wenn man einen string zeichenweise liest, sollte man eben die stringgrenze/länge berücksichtigen, nicht nur in C. allerdings hatte john diesen teil ja sowieso schon richtig.
die 2.variante ist allerdings totaler müll -- bitte löschen/ignorieren <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

Tom

Re: Zeiger

#9 Post by Tom »

Sorry john,

da habe ich wohl ein wenig flüchtig gelesen. Ansonsten sieht das mit deinen zeigern doch gut aus. Vielleicht noch :
char wort[MAX] ="";

Anonsten trotzdem noch mal der Wink auf strtok <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">, zumal man damit recht gut mehrere (Trenn)zeichen abfragen kann.
Gruss
Tom

Udo Kanter

Re: Zeiger

#10 Post by Udo Kanter »

Ich hatte keinesfalls vor, Fehler in irgendwelche Schuhe zu schieben. Dann wären meine (Schuhe) nämlich ziemlich voll.

Aber an diesen kleinen Beispielen wird jedoch klar, dass C keine Anfängersprache ist.

john

Re: Zeiger

#11 Post by john »

Erstmal: Danke!!!

Aber da habe ich noch zwei Frage:

char str[MAX] = "Hello World";
char wort[MAX];

kann ich nun auch das erste Wort ermitteln ohne char wort[MAX] zu verwenden?
Der Anfang von str[MAX] bis zum ersten ' ' soll in *p abgelegt werden.
Ich hoffe ihr versteht was ich meine! Und wie ist es eigentlich wenn ich einen Text parse.
Ich weiß ja nicht wie lang die einzelnen "Stücke" sind.

z. B.

haus-baum:2

soll nun in "haus", "baum", und "2" zerlegt werden (ohne strtok etc.).

nun könnte auch eine Zeile

Einsehrlangeswort-Nochmaleinsehrsehrlangeswort:1337

heißen.

die Vars in welchen die einzelnen Teile liegen müssten dynamisch sein?! Wie stell ich das an???

john

rattengift

Re: Zeiger

#12 Post by rattengift »

> kann ich nun auch das erste Wort ermitteln ohne char wort[MAX] zu verwenden? Der Anfang von str[MAX] bis zum ersten ' ' soll in *p abgelegt werden.
> Ich hoffe ihr versteht was ich meine!

also ich verstehs jedenfalls nicht.

> Und wie ist es eigentlich wenn ich einen Text parse. Ich weiß ja nicht wie lang die einzelnen "Stücke" sind.
> die Vars in welchen die einzelnen Teile liegen müssten dynamisch sein?! Wie stell ich das an???

du musst mit malloc arbeiten (ist in deinem c-buch sicher erklärt).
da du auch nicht weisst, wie viele wörter kommen werden, kannst du auch keinen wort-array mit einer festen zahl von elementen verwenden. stattdessen könntest du eine "linked list" verwenden (eine gute übung für die programmierung mit pointern. ob diese lösung effektiv ist, hängt davon ab, was du mit der wort-liste machen willst. um zb ein bestimmtes wort darin zu suchen, ist sie nicht effektiv, da gibt es geeignetere datenstrukturen (die aber auch komplexer sind)).

Post Reply