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

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

Code: Alles auswählen

NameBuffer[strlen(NameBuffer)] = ' ' 
ü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 :wink:

Gruß,
Happy

Verfasst: Sa 25. Mär 2006, 20:56
von Elle4u
Happy hat geschrieben:Ist aber vergleichsweise teuer :wink:
Das dachte ich mir. :wink:

Deine Lösung hat funktioniert. Danke :hello:

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! :up:

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? :p :D

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? :p :D
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... :wink:

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

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

Code: Alles auswählen

 undefined reference to `sscanf' 

Verfasst: Do 6. Apr 2006, 18:59
von ibbi
t3xi hat geschrieben:Eigentlich nicht. ;)
Jedenfalls nicht mit libc.a und libgcc.a

Code: Alles auswählen

 undefined reference to `sscanf' 
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