PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Variabeln trennen



NEAVORC
05.12.2008, 13:07
Hi zusammen,

bin gerade dabei mein Objektorientiertes C++ auf zu frischen und bin auf ein Problem gestoßen.

Ich habe vor aus einem Memofeld Daten einzel in Edit-Boxen zu packen.

Jedoch steht vor dem Wert den ich haben will noch eine Info dazu.
(BTW: Das wird ein Haushaltsprogramm)
Die Lines der Memofeldes sehen dann folgendermassen aus:
Auto : 100
Versicherung : 100
Miete : 200
(Fiktive Werte)
Jetz will ich die Information aber nicht in die Edit Felder übernehmen sondern nur
die Zahl.
Da ich mit denen weiter rechnen muss und das mit Text davor schlecht geht :D


Zu meiner Lösungsvorstellung:
Die Letzen 4 Ziffern der Variable werden ausgelesen.
Wenn jedoch die erste der 4 nichts ist oder ein Buchstabe von der Info dann soll diese nicht mitgenommen werden und es werden nur die 3 letzen ziffern übernommen.
So geht das dann weiter das ich dann eine Variable nur mit dem Wert habe ohne Buchstaben und Leerzeichen davor oder dahinter.

Ich habe im Internet schon nach einer Lösung gesucht aber nichts passte wirklich auf meine Vorstellungen.

Ich hoffe ihr könnt mir helfen ;)
cheerio

Hamachi-1
05.12.2008, 13:58
Du kannst das alles in case machen.
was du sonst noch so meinst weiß ich nicht^^

Auto : 100
Versicherung : 100
Miete : 200

z.B

du sagst um das Auto abzurufen wäre 1.

case '1':
cout << "Auto: 100" << endl;
break;

NEAVORC
05.12.2008, 14:03
Ich glaub du hast mich nicht verstanden :)
Danke für die Mühe aber "Auto : 100 " ist ein TString und den versuche ich zu trennen so wie es bei Python möglich ist.

-[RiDER]-
05.12.2008, 14:43
Hi :D


Ich glaub du hast mich nicht verstanden
Ich würde sagen, dass Du Dich wahnsinnig ungenau ausgedrückt hast...

Wie wäre es, wenn Du von hinten Zeichen für Zeichen daraufhin untersuchst, ob es eine Ziffer repräsentiert und bei der ersten Nicht-Ziffer aufhörst.
Dann die bisher eingelesenen chars in ints verwandelst (wurde gestern erst hier in der C/C++/C#-Sektion diskutiert) und fertig!?

Oder Du arbeitest mit regex.h, einem POSIX-Header, der reguläre Ausdrücke mitbringt - damit würde sich das Ganze auf eine Zeile reduzieren... :)

GreetZ RiDER :D :D :D

NEAVORC
05.12.2008, 15:00
Ich glaube nicht das ich mich ungenau ausgedrückt habe und dein Post entspricht ungefähr dem was ich vor habe.
Aber weiter hat mich das auch nicht gebracht...

-[RiDER]-
05.12.2008, 15:03
Dann weiß ich nicht, was Du als Antwort erwartest...
Mehr als alles was Du brauchst kann ich Dir nicht geben!

NEAVORC
05.12.2008, 15:12
Also bei Python gibts Funktionen die ab einem bestimmten Zeichen(Zahl,Buchstabe oder Leerzeichen)
entweder das was davorc steht oder das was dahinter steht als eine neue Variable deklarieren.
Dasselbe habe ich auch vor.
Also aus dem String NUR die zahl zu bekommen mehr nicht.

Ich ich hatte gehofft das vllt jemand solch eine Funktion Posten und kurz erläutern könnte

-[RiDER]-
05.12.2008, 15:31
char *gimme_the_digits(const *char string, size_t len)
{
int pos;
for(pos = 1; isdigit(string[len - pos]); pos++);
return &string[len - pos + 1];
}

Irgendsowas...

NEAVORC
05.12.2008, 15:48
Ok sowas hab ich gesucht :D

Danke dir ich werd mal morgen ein wenig damit rumprobieren
;)

blackberry
05.12.2008, 16:05
Ich hoffe das ist was du gesucht hast (denn es hat mich ganz schön viel Zeit gekostet es du schreiben!):


#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define MAX_ENTRY_NAME 100
#define MAX_ENTRY_CONTENT 1024


void get_entry_error(int line, char *ptr, char *reason)
{
char near[6];
char *pos;

strncpy(near, ptr, sizeof(near) - 1);
if ((pos = strstr(near, "\n")))
*pos = 0;
printf("%d: syntax error near \"%s\" (%s)\n"
, line
, near
, reason);
exit(0);
}

char *get_entry(char *n, char *data)
{
/* buffers */
static char *name = 0;
static char *content = 0;
/* lengths */
int l_name = 0;
int l_content = 0;
/* "bool"s */
int is_content = 0;
int name_disabled = 0;
int content_disabled = 0;
/* current line */
int line = 1;

if (!name && !content)
{
name = (char *) malloc(MAX_ENTRY_NAME);
content = (char *) malloc(MAX_ENTRY_CONTENT);

if (!name || !content)
{
puts("out of memory");
exit(0);
}
}

memset(name, 0, MAX_ENTRY_NAME);
memset(content, 0, MAX_ENTRY_CONTENT);

while(*data)
{
switch(*data)
{
case '\n':
if (!is_content)
get_entry_error(line, data, "statement has no content");

/* is this the entry we were searching for? */
if (!strcmp(name, n)) return content;

memset(name, 0, MAX_ENTRY_NAME);
memset(content, 0, MAX_ENTRY_CONTENT);
is_content = 0;
name_disabled = 0;
content_disabled = 0;
l_name = 0;
l_content = 0;
line++;
break;
case ' ': case '\t':
if (is_content)
{
if (l_content)
content_disabled = 1;
}
else if (l_name)
{
name_disabled = 1;
}
break;
case ':':
if (is_content)
get_entry_error(line, data, "':' not allowed within this context");
is_content = 1;
name_disabled = 0;
break;
default:
if (name_disabled || content_disabled)
get_entry_error(line, data, "spaces are not allowed within names");
if (is_content)
{
if (l_content == MAX_ENTRY_CONTENT)
get_entry_error(line, data, "the content exceeds the buffer");
content[l_content++] = *data;
}
else
{
if (l_name == MAX_ENTRY_NAME)
get_entry_error(line, data, "the name exceeds the buffer");
name[l_name++] = *data;
}
}
data++;
}

return 0; /* nothing found */
}

int is_numeric(char *buffer)
{
if (buffer[0] == '-' && buffer[1] >= '0' && buffer[1] <= '9')
buffer++;
for(; *buffer >= '0' && *buffer <= '9'; buffer++);
return (*buffer == 0);
}

int main(void)
{
char cfg[] = "Auto : 100\n"
"Versicherung : 100\n"
"Miete : 200\n";
char *ptr;
int number;

if (!(ptr = get_entry("Auto", cfg)))
{
printf("entry not found\n");
}
else if (is_numeric(ptr))
{
number = atoi(ptr);
/* we really extracted the number...
as proof we do a simple calculation */
printf("content + 123 = %d\n", number + 123);
}
else
{
printf("entry is not a number\n");
}
return 0;
}

Ich habe mich mal an den "Coding-Standard" (http://www.free-hack.com/viewtopic.php?t=28480) gehalten und wenig kommentiert.
Wenn du etwas nicht verstehst frag einfach nur.

Zudem habe ich mich bemüt einige mögliche Fehler per Fehlermeldung auszugeben.
Solche Fehler sind zB: keinen Inhalt, also eine Zeile ohne ":", Lücken in Namen ("Aut o" --> Fehler), ":" im Inhaltsteil ("Auto: a:b" --> Fehler), ...

Außerdem werden Leerzeichen ignoriert ("Auto : 100" und " Auto : 100" sind das Selbe).

Der Code enthält auch ein Beispeil, also sollte die Benutzung klar sein.
Wenn nicht:
get_entry(n, b)
liefert einen Zeiger auf einen Zeichenvektor, der den Inhalt für das Element n im buffer b enthält.
Wenn n nicht in b gefunden werden kann, wird 0 zurückgegeben!
Damit n gefunden werden kann muss es in der Groß-/Keinschreibung mit dem in b befindlichen n übereinstimmen!

PS: der Puffer für den Rückgabewert der Funktion ist statisch um Speicher zu sparen, nach einem folgenden Aufruf:
ptr1 = get_entry("Auto", cfg);
ptr2 = get_entry("Miete", cfg);
entspricht ptr1 ebenfalls der Miete (da auf die selbe Speicherstelle gezeigt wird, also; ptr1 == ptr2 ist Wahr).


mfG. BlackBerry