014
26.04.2004, 18:25 Uhr
(un)wissender
Niveauwart
|
Das sollte funzen, auch wenn man etwas kürzeres mit etwas längerem ersetzt. Übersichtlich ist es meiner Meinung nach auch. Ist sogar ein bisschen getestet. Hoffentlich ist das reines C, habe mich bemüht. In C++ wäre das ganze sehr einfach, std::string::replace.
C++: |
#include <stdlib.h> #include <stdio.h> #include <string.h>
char * replace(const char * originalString, const char * oldSubstring, const char *newSubstring); int equals(const char * one, const char * two, int length);
int main(int argc, char *args[]) { char * newString = 0; if(argc < 3) { printf("Mehr Parameter!"); return 0; } printf("Old string: %s\n", args[1]); newString = replace( args[1], args[2], argc > 3 ? args[3] : "" ); printf("New string: %s\n", newString); free(newString); return 0; }
char * replace(const char * originalString, const char * oldSubstring, const char *newSubstring) { int lengthOfOld = strlen(oldSubstring), lengthOfNew = strlen(newSubstring), lengthOfOriginal = strlen(originalString); const char * maxChar = originalString + lengthOfOriginal; char * newString, * newStringRun; //Nichts ist zu erstetzen if(!lengthOfOld) { newString = (char *)malloc(lengthOfOriginal + 1); return strcpy(newString, originalString); } //Theoretisch maximale Länge des neuen Strings ermitteln und allokieren. newString = (char *)malloc(lengthOfOriginal + (lengthOfNew - lengthOfOld) * (lengthOfOriginal / lengthOfOld) + 1); newStringRun = newString; while(originalString <= maxChar) { if(equals(originalString, oldSubstring, lengthOfOld)) { memcpy( newStringRun, newSubstring, lengthOfNew ); originalString += lengthOfOld; newStringRun += lengthOfNew; } else { *newStringRun++ = *originalString++; } } *newStringRun = '\0'; return newString; }
//Besser wäre nach Pratt und Konsorten, so ist es aber einfacher zu verstehen! int equals(const char * one, const char * two, int length) { int i = 0; while(i++ < length) { if(*one++ != *two++) return 0; } return 1; }
|
-- Wer früher stirbt ist länger tot. |