Seite 1 von 3
Benötige kleine Hilfe mit String-Operation :-)
Verfasst: Sa 25. Mär 2006, 19:35
von Elle4u
Hallo,
ich benötige mal Eure Hilfe zwecks einer String-Operation.

ops:
Ich möchte von einem String 4 Zeichen abschneiden und danach noch ein Leerzeichen anfügen:
Code: Alles auswählen
NameBuffer[strlen(NameBuffer) - 4] = 0;
//Leerzeichen anhängen
NameBuffer[strlen(NameBuffer)] = ' ';
NameBuffer[strlen(NameBuffer)] = 0;
Nun passier aber folgendes:
Aus dem String "Hallo.rec" wird:
"Hallo"
"Hallo rec"
"Hallo rec"
Wie kann ich verhindern, daß nach Anfügen des Leerzeichens wieder die Extension da ist?
Ich könnte natürlich über eine erneute Variable gehen aber das finde ich etwas übertrieben...
Danke für Eure Tips!
Verfasst: Sa 25. Mär 2006, 20:02
von Bonni
Geht das? Aber auch übertrieben...
for (i=1;i<5;i++){
NameBuffer[strlen(NameBuffer) -i] = 0;
}
Verfasst: Sa 25. Mär 2006, 20:33
von cms
Code: Alles auswählen
NameBuffer[strlen(NameBuffer) - 4] = ' ';
NameBuffer[strlen(NameBuffer) - 3] = \0;
Ist aber nicht gut:
strlen sucht 2x den string ab.
strings der Länge kleiner 3?
Code: Alles auswählen
int n = strlen(NameBuffer);
if (n > 4) {
*(NameBuffer+n-4) = ' ';
*(NameBuffer+n-3) = \0;
}
Verfasst: Sa 25. Mär 2006, 20:39
von Elle4u
Das Problem ist, daß ich das Anhänger des Leerzeichens immer machen muß und das Kürzen nur manchmal...
Am Besten mache ich einfach eine Temp-Variable mit der aktuellen len und mache dann das Leerzeichen dazu und len+1 ist dann 0...
Verfasst: Sa 25. Mär 2006, 20:49
von Happy
Elle4u hat geschrieben:
Code: Alles auswählen
NameBuffer[strlen(NameBuffer) - 4] = 0;
//Leerzeichen anhängen
NameBuffer[strlen(NameBuffer)] = ' ';
NameBuffer[strlen(NameBuffer)] = 0;
Hallo,
das Problem ist mit der Zeile
überschreibst du den zuvor gesetzten Nullterminator mit einem Leerzeichen.
Damit wird der alte Nullterminator hinter dem rec wieder aktiv.
Es wird also nur der . durch ein Leerzeichen ersetzt.
Folgendes sollte klappen:
Code: Alles auswählen
NameBuffer[strlen(NameBuffer) - 4] = 0;
//Leerzeichen anhängen
strcat(NameBuffer," ");
Gruß,
Happy
Verfasst: Sa 25. Mär 2006, 20:51
von Elle4u
Happy hat geschrieben:Folgendes sollte klappen:
Code: Alles auswählen
NameBuffer[strlen(NameBuffer) - 4] = 0;
//Leerzeichen anhängen
strcat(NameBuffer," ");
OK. Danke. Werde ich mal versuchen.
Folgendes hatte auch gerade funktioniert:
Code: Alles auswählen
//Leerzeichen anhängen
TAP_SPrint(NameBuffer, "%s%s", NameBuffer, " ");
Verfasst: Sa 25. Mär 2006, 20:52
von Happy
Elle4u hat geschrieben:
Folgendes hatte auch gerade funktioniert:
Code: Alles auswählen
//Leerzeichen anhängen
TAP_SPrint(NameBuffer, "%s%s", NameBuffer, " ");
Ist aber vergleichsweise teuer
Gruß,
Happy
Verfasst: Sa 25. Mär 2006, 20:56
von Elle4u
Happy hat geschrieben:Ist aber vergleichsweise teuer
Das dachte ich mir.
Deine Lösung hat funktioniert. Danke

Verfasst: Sa 25. Mär 2006, 21:19
von Happy
Viele weitere praktische Stringoperationen gibt es
hier.
Gruß,
Happy
Verfasst: Sa 25. Mär 2006, 22:10
von Elle4u
Happy hat geschrieben:Viele weitere praktische Stringoperationen gibt es
hier.
Danke!

Verfasst: Mi 5. Apr 2006, 18:26
von digitus
Hi Elle;
Du könntest auch die strings mit der Scanf Funktion in einzelne char zerlegen und diese wieder als String mit sprintf neu zusamenstellen.
greetings
Verfasst: Mi 5. Apr 2006, 19:07
von t3xi
Seit wann kann man denn Scanf in TAPs verwenden? Verrate uns doch mal welche Header und Libs man dafür braucht?

Verfasst: Mi 5. Apr 2006, 19:51
von digitus
Hi T3xi;
Wieso sollte der Befehl nicht in Taps verwendet werden können. Bisher ist mir nicht bekannt, daß es bei Taps irgendwelche Einschräkungen in include - Dateien gibt.
greetings
Verfasst: Do 6. Apr 2006, 11:00
von ibbi
t3xi hat geschrieben:Seit wann kann man denn Scanf in TAPs verwenden? Verrate uns doch mal welche Header und Libs man dafür braucht?
Ohne jetzt nachschauen zu können: stdio.h und libc?
Verfasst: Do 6. Apr 2006, 11:18
von Happy
ibbi hat geschrieben:Ohne jetzt nachschauen zu können: stdio.h und libc?
Stimmt im Prinzip. Leider arbeitet der Compiler mit der libtap, dort fehlen die Funktionen aus stdio.
Ich habe das mal probiert. Beim Compilieren gehts noch durch, aber der Linker beschwert sich, dass er scanf nicht auflösen kann.
Deswegen gibt es ja auch Ersetzungen von Topfield für Befehle wie printf, fopen usw., weil die eben im Standardbefehlsatz fehlen.
Gruß,
Happy
Verfasst: Do 6. Apr 2006, 12:42
von nollipa
Hallo,
ich kenne mich mich ja mit programmieren gar nicht aus. Also habe ich mal gegoogelt und das hier gefunden:
Ausser dass es die Laune etwas aufheitert, dürfte das wieder mal ein sehr unqualifizierter Beitrag sein...

Verfasst: Do 6. Apr 2006, 13:47
von ibbi
Happy hat geschrieben:Stimmt im Prinzip. [...]dort fehlen die Funktionen aus stdio.
Oh Mann, wie kann ich nur so blöd sein. Vielleicht hätte ich beim Lesen mein Gehirn einschalten sollen.
Natürlich können die I/O-Funktionen aus der libc nicht verwendet werden.
PS: digitus meinte aber wohl
sscanf, und das müsste eigentlich funktionieren.
Verfasst: Do 6. Apr 2006, 13:59
von t3xi
Eigentlich nicht.
Jedenfalls nicht mit libc.a und libgcc.a
Verfasst: Do 6. Apr 2006, 18:59
von ibbi
t3xi hat geschrieben:Eigentlich nicht.
Jedenfalls nicht mit libc.a und libgcc.a
Stimmt, auch die Bemerkung zu
sscanf ziehe ich zurück.
Topfield hat die beiden einzigen Funktionen aus
stdio.h, deren Einsatz in einem TAP noch Sinn machen würde, nämlich
sscanf und
s(n)printf durch
TAP_SPrint selbst definiert.
Verfasst: Do 6. Apr 2006, 20:01
von digitus
Hi;
Ihr habt natürlich Recht. War mein Fehler. Liegt wohl daran, daß
ich schon seit längerer Zeit für den Topfield nichts mehr programmiert habe und bei mir der Unterschied zwischen den Funktionen des GCC mit einem "normalen" C-Compiler wohl etwas durcheinander geraten sind. Also wie IBBI richtig bemerkt hat, arbeitet sscanf beim Topf nicht -> wirklich schade.
greetings