char-Array "transformieren"

lindin

Erfahrenes Mitglied
Hallo,

es gibt eine Oraclefunktion, die folgendermaßen funktioniert:


Code:
translate ('1tech23', '123', '456); would return '4tech56' 
translate ('222tech, '2ec', '3it'); would return '333tith'

Es werden also alle Zeichen aus dem ersten String, die im zweiten String vorkommen, mit dem Zeichen ersetzt, welches im dritten String an der gleichen Stelle ist, wie das im zweiten String!

Kompliziert ausgedrückt, aber das Beispiel zeigt es ganz gut!

ich könnte natürlich für jedes Zeichen in String 1, String 2 durchsuchen, und dann den Index nehmen, und das Zeichen aus String drei nehmen, aber vielleicht gibt es ja auch so eine Funktion in c?

Mir würde ja eine Funktion wie die java-Funktion getIndexOf() (oder so ähnlich) schon weiterhelfen!

Weiß da jemand was?
 
strchr -> findet einen char in einem String und liefert einen Zeiger darauf zurück, false, falls er nicht gefunden wurde. (Daraus kannst du dir natürlich auch einen Index errechnen, ist ja aber nicht nötig.)

Die Funktion könnte dann zB so aussehen:
Code:
void translate(char*str, const char*tr, const char*by){
	int index = 0;
	while(tr[index]){
		char* tmp = str;
		while(tmp){
			tmp = strchr(tmp, tr[index]);
			*tmp = by[index];
		}
	}
}


Dann gibts noch irgendeine Funktion, die gibt dir direkt den Index des übergebenen chars in einem String zurück. Wie die heisst, hab ich aber vergessen, ausserdem hat sie keine Error-Return, falls der char nicht gefunden wurde (hab noch nie ausprobiert, was dann zurückgegeben wurde).
 
Meinst Du, meine Funktion geht auch? Die sieht soviel einfacher aus, daß ich denke, sie tut doch nicht das richtige....:

Code:
for(i=0;i<strlen(stringtotransform);i++){
	   for(x=0;x<96;x++){
		   if(stringtotransform[i]==from[x]){
			   stringtotransform[i]=to[x];
		   }
	   }
   }

In strintotransform sthet ser zu transfromierende String, in from stehen die ZEichen die umgewandelt werden sollen, und in to, die, in die sie umgewandelt werden sollen!
 
Code:
for(i=0;i<strlen(stringtotransform);i++){
d.h: Bei jedem Schleifendurchlauf muss die Stringlänge neu bestimmt werden.
Das ist geschwindigkeitsmässig nicht sonderlich überzeugend, besser wäre:
Code:
int i = strlen(stringtotransform);
while(i--){
( ausserdem arbeite ich einfach lieber mit while-schleifen ;-), da for-schleifen meistens nur 1-2 zeilen weniger Platz zu Ungunsten der Codelesbarkeit einnehmen.)

...
Code:
for(x=0;x<96;x++){
Ist die Länge von from und to denn immer genau 96?
Besser wäre:
Code:
int x = -1;
while(from[++x]){

Und nochmal zusammengefasst:
Code:
int i = strlen(stringtotransform);
while(i--){
	int x = -1;
	while(from[++x])
	   if(stringtotransform[i]==from[x])
		   stringtotransform[i]=to[x];
}

Aber ansonsten sollte es funktionieren, würd ich auf den ersten Blick sagen. Die Geschwindigkeit wäre vielleicht (aber nur vielleicht, denn man kann ja nie wissen, wie schnell Routinen wie strchr arbeiten) sogar schneller, als mein Vorschlag.
 
Zurück