Ergebnis 1 bis 10 von 10
  1. #1
    <3 catz Avatar von NEAVORC
    Registriert seit
    04.09.2007
    Beiträge
    322

    Standard [C++] Variabeln trennen

    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


    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
    (╯°□°)╯︵ ┻━┻
    Back2Pwn
    PM for new ICQ

  2. #2
    W32.FunLove
    Registriert seit
    05.08.2007
    Beiträge
    137

    Standard

    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;

  3. #3
    <3 catz Avatar von NEAVORC
    Registriert seit
    04.09.2007
    Beiträge
    322

    Standard

    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.
    (╯°□°)╯︵ ┻━┻
    Back2Pwn
    PM for new ICQ

  4. #4
    CIH-Virus Avatar von -[RiDER]-
    Registriert seit
    05.01.2007
    Beiträge
    496

    Standard

    Hi

    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

  5. #5
    <3 catz Avatar von NEAVORC
    Registriert seit
    04.09.2007
    Beiträge
    322

    Standard

    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...
    (╯°□°)╯︵ ┻━┻
    Back2Pwn
    PM for new ICQ

  6. #6
    CIH-Virus Avatar von -[RiDER]-
    Registriert seit
    05.01.2007
    Beiträge
    496

    Standard

    Dann weiß ich nicht, was Du als Antwort erwartest...
    Mehr als alles was Du brauchst kann ich Dir nicht geben!

  7. #7
    <3 catz Avatar von NEAVORC
    Registriert seit
    04.09.2007
    Beiträge
    322

    Standard

    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
    (╯°□°)╯︵ ┻━┻
    Back2Pwn
    PM for new ICQ

  8. #8
    CIH-Virus Avatar von -[RiDER]-
    Registriert seit
    05.01.2007
    Beiträge
    496

    Standard

    Code:
    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...

  9. #9
    <3 catz Avatar von NEAVORC
    Registriert seit
    04.09.2007
    Beiträge
    322

    Standard

    Ok sowas hab ich gesucht

    Danke dir ich werd mal morgen ein wenig damit rumprobieren
    (╯°□°)╯︵ ┻━┻
    Back2Pwn
    PM for new ICQ

  10. #10
    Der mit Anatidaephobie Avatar von blackberry
    Registriert seit
    11.07.2008
    Beiträge
    2.350

    Standard

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

    Code:
    #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

    PDFTT cr3w a.E. — ReiDC0Re, lindor, Sera, berry
    please do feed the trolls crew and elk
    Ehrenwerte Mitglieder im Ruhestand: OpCodez, SFX.
    "Was sich blackberry gerade denkt" — Vorsicht! Frei laufender Wahnsinn!
    Zitat von fuckinghot19: "PS: Blackberry ist auf FH der Trollkönig ^^."
    An dieser Stelle danke ich all meinen Fans und Hatern gleichermaßen ^.^

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •