Forum: Mikrocontroller und Digitale Elektronik liste stringoperationen in c


von Timo P. (latissimo)


Lesenswert?

Hallo hat jemand einen schönen Link für mich, wo die *ganzen* 
C-Funktionen wie strcmp() usw. aufgeführt sind?

Google ist ja mein bester Freund, aber ich finde immer nur C++ Listen 
oder halt Listen, die nicht vollständig sind, und nur 5 oder 6 
funktionen beschreiben.

von ... .. (docean) Benutzerseite


Lesenswert?

in der string.h von deinem Compiler steh alle drin... g

Für WinAVR bzw. avrlibc gibts: 
http://avr-libc.nongnu.org/user-manual/group__avr__string.html

von Timo P. (latissimo)


Lesenswert?

in diesem Falle ist es einerseits WINAVR
andererseits CCE für MSP430

von Karl H. (kbuchegg)


Lesenswert?

Timo P. schrieb:
> in diesem Falle ist es einerseits WINAVR
> andererseits CCE für MSP430

spielt keine Rolle.

* entweder haben beide Entiwcklungswerkzeuge die geforderte
  Funktionalität volständig implementiert, dann steht immer noch in 
jedem
  string.h eine identische Liste aller Funktionen

* oder ein System ist nicht vollständig. In dem Fall steht wiederrum
  in string.h die vollständige Liste für das jeweilige System


Aber eigentlich sollte in jeder halbwegs brauchbaren Literaturquelle 
eine vollständige Liste aller string.h - Funktionen drinnen sein. So 
viele sind es dann auch wieder nicht.

Ansonsten ist Google nach wie vor dein Freund und liefert zb das hier

http://home.fhtw-berlin.de/~junghans/cref/FUNCTIONS/funcref.html

von Timo P. (latissimo)


Lesenswert?

ok dann halt ne direkte Frage:

ich will alle 'T' aus einem string enfernen, welche fkt. nutze ich? in 
der angegebenen Liste habe ich leider keine Fkt. gefunden...

von Karl H. (kbuchegg)


Lesenswert?

Timo P. schrieb:
> ok dann halt ne direkte Frage:
>
> ich will alle 'T' aus einem string enfernen, welche fkt. nutze ich? in
> der angegebenen Liste habe ich leider keine Fkt. gefunden...

Du wirst lachen:
Es gibt auch keine

Selber schreiben, ist doch mit dem Baukasten, den du an str... 
Funktionen hast kein allzugrosses Problem.
(Nb. eigentlich benötigt man dafür gar keine str... Funktionen. Einfach 
den Text von einem String in einen anderen umkopieren, wobei man bei 
einem 'T' einfach nichts umkopiert. Fertig. Ein 5-Zeiler)


Wenn du verstanden hättest, wie Strings in C funktioniern, wäre dir auch 
klar, dass es keine Standard-str... Funktion dafür geben kann. strtok 
ist schon grenzwertig genug. Keine str... Funktion kann einen 
übergebenen String verändern, ohne dass irgendein Sicherheitskonzept auf 
der Strecke bleibt. Die einzige Ausnahme strtok() schafft mehr Probleme 
als sie löst. Und strdup() ist auch nicht das gelbe vom Ei.

Fazit: Ohne Umgebungswissen aus deiner Applikation, ist jeder Versuch 
einen übergebenen String direkt beim Aufrufer zu verändern eine 
Harakiri-Aktion. Deshalb hat man es dann auch bei den str... Funktionen 
bleiben gelassen, so etwas anzubieten.

von Timo P. (latissimo)


Lesenswert?

Ok, ich wusste nicht, dass es keine fertige ftk. gibt, aber deswegen 
direkt zu sagen:

Karl heinz Buchegger schrieb:
> Wenn du verstanden hättest, wie Strings in C funktioniern, ...

hm....

Ok, da ich nicht verstanden habe, dass solch eine fkt. nicht möglich 
ist, werde ich mir sie selber schreiben, fertig aus, Thema gegessen.

von Karl H. (kbuchegg)


Lesenswert?

Timo P. schrieb:
> Ok, ich wusste nicht, dass es keine fertige ftk. gibt, aber deswegen
> direkt zu sagen:
>
> Karl heinz Buchegger schrieb:
>> Wenn du verstanden hättest, wie Strings in C funktioniern, ...
>
> hm....
>
> Ok, da ich nicht verstanden habe, dass solch eine fkt. nicht möglich
> ist,

Da war ich vielleicht etwas zu restriktiv. Möglich ist es schon. Aber 
gefährlich.

Das Problem in C ist nun mal, dass es kein wirkliches 'String'-Konzept 
gibt, in welchem ein String ein eigenständiger Datentyp ist. Da ist das 
Problem wiederrum die dynamische Natur von Strings. C hat dafür nur ein 
Konzept: das dynamisch allokierte Array. Und das wäre zu weitreichend, 
als das man eine einfache Sprache wie C damit belasten wollte. Daher 
besteht String-Verarbeitung in C hauptsächlich aus einem Satz von 
Konventionen und einer Handvoll oft benötigter Funktionen, die diese 
Konventionen berücksichtigen.

von Timo P. (latissimo)


Lesenswert?

mein string sieht etwa so aus

T-45  daraus wird dann später eine -22.5


meine Idee ist, hier eine fkt. zu schreiben, die alles in einem abwasch 
macht.
z.B.

int convert_temp(char* str)
{

}

von Karl H. (kbuchegg)


Lesenswert?

Timo P. schrieb:
> mein string sieht etwa so aus
>
> T-45  daraus wird dann später eine -22.5
>
>
> meine Idee ist, hier eine fkt. zu schreiben, die alles in einem abwasch
> macht.
> z.B.
>
> int convert_temp(char* str)
> {
>
> }

Ja. Ist der Aufbau immer gleich oder kann es sein, dass das 'T' nicht 
vorkommt, bzw. noch was anderes davor steht.
1
int convert_temp( char* str )
2
{
3
  int number;
4
5
  number = atoi( str + 1 );  // erstes Zeichen ignorieren
6
7
  ...
8
}

oder
1
int convert_temp( char* str )
2
{
3
  int number;
4
5
  if( *str == 'T' )   // erstes Zeichen ist ein T: ignorieren
6
    str++;
7
8
  number = atoi( str );
9
  ...
10
}

oder
1
int convert_temp( char* str )
2
{
3
  int number;
4
  char* startOfNumber;
5
6
  // suche das erste 'T', gleich dahinter beginnt die Zahl
7
  // gibt es kein T, dann nimm alles
8
  startOfNumber = strchr( str, 'T' );
9
  if( startOfNumber )
10
    startOfNumber++;
11
  else
12
    startOfNumber = str;
13
14
  number = atoi( startOfNumber );
15
16
  ...
17
}


:-)
In keinem einzigen Fall musste ein Zeichen ersetzt oder gar aus dem 
String herausgelöscht werden. Letztendlich läuft alles nur darauf 
hinaus, den Startpointer für atoi richtig einzustellen.
:-)

von Peter (Gast)


Lesenswert?

dafür würde ich gar keine funktion nehmen, einfach mit einer for 
schleife durchgehen und immer wenn ein T kommt, weiter zählen.
1
char* s = "asdfsadfTAdfasT";
2
3
char* c1 = s;
4
char* c2 = s;
5
6
while( *c1 ) {
7
  if ( *c1 != 'T' ) {
8
     *c2 = *c1;
9
     c2++;
10
  } 
11
  c1++;
12
}
13
*c2 = 0;
(nicht getestet)

von Klaus W. (mfgkw)


Lesenswert?

und mit do...while spart man sich *c2=0; zum Schluß...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.