/*
Project ReplaceString

Function to replace substrings in strings

Version 1.0 / 2002.04.01
Autor: pstrainer@gmx.net
*/

#include 
#include 
#include 

#define line_maxlen 100
#define myversion 1		// valid options: {1,2}
int replace_string(char*,char*,char*);
int replace_sub (char*,char*,int,int);

void main (void) {

	char mystring[line_maxlen];
	char src[line_maxlen];
	char dst[line_maxlen];
	int sl1,sl2,found;

	printf("Projekt ReplaceString\n");

	sl1=1;
	while (sl1>0) {
		printf("\nGeben sie einen Text ein: ");
		gets(mystring);
		sl1=strlen(mystring);
		if (sl1) {
			printf("Suche nach: ");
			gets(src);
			sl2=strlen(src);
			if (sl2) {
				printf("Ersetzen durch: ");
				gets(dst);
				printf("Original-String: <%s>\n",mystring);
				printf("<%s> wird ersetzt durch <%s>\n",src,dst);

				found=replace_string(mystring,src,dst);

				printf("Ergebnis-String: <%s>\n",mystring);
				printf("%d Teilstrings ersetzt\n",found);
			}
		}
	}
}

int replace_string(char *x,char *src,char *dst) {
/*
Funktion replace_string
Ersetzen von Zeichenketten (substrings) in Zeichenketten (strings)

Version 1.0 / 2002.04.01
Autor: pstrainer@gmx.net

Syntax:
	int replace_string(char*,char*,char*);
	...
	char string[...];
	char src[...];
	char dst[...];
	int n;
	...
	n=replace_string(string,src,dst);

Return = Number of substrings replaced
Length: 30 lines of code (this function)
		 8 lines of code (sub version 1)
        13 lines of code (sub version 2)

     38-43 lines of code (total)
*/
	char c,d;
	int i,j,anf,lensrc,counter;

	lensrc=strlen(src);
	counter=i=j=0;
	anf=-1;
	c='$';
	while (c!='\0') {
		c=x[i];					// string character
		d=src[j];				// src character

		if (d=='\0') {			// end of src ?
			if (anf>=0) {
				i=replace_sub(x,dst,anf,lensrc);
				counter++;
			}
			anf=-1;
			j=0;
		}

		if (c==d) {				// match ?
			if(anf<0) {anf=i;}	// start of match
			j++;				// next match char
		}

		else if (anf>=0) {		// no match ?
				anf=-1;
				j=0;
		}

		i++;					// next string character
	}
	return counter;
}

// *************** Version 1 ********************
#if myversion==1

int replace_sub (char *x,char *z, int p, int q) {
// cut q characters at position p
// insert string ins into string x at position p
// return next position to investigate
// Length: 13 lines of code
	char buffer [line_maxlen];
	int i,j;

	// copy end of x to buffer
	i=p+q; j=0;						// strcpy(buffer,x+p+q);
	while (x[i]!='\0') {buffer[j++]=x[i++];}
	buffer[j]='\0';

	// copy dst to x
	i=p; j=0;						// strcat( x, z );
	while (z[j]!='\0') {x[i++]=z[j++];}

	// copy end to x
	j=0;							// strcat(x,buffer);
	while (buffer[j]!='\0') {x[i++]=buffer[j++];}
	x[i]='\0';

	return p+q-1;					// return position to continue
}

// *************** Version 2 ********************
#elif myversion==2

int replace_sub (char *x,char *z, int p, int q) {
// cut q characters at position p
// insert string ins into string x at position p
// return next position to investigate
// Length: 8 lines of code
	char buffer [line_maxlen];

	strcpy( buffer, x+p+q);			// copy end of x to buffer
	x[p]='\0';						// clip x
	strcat( x, z );					// copy dst to x
	strcat(x,buffer);				// copy end to x
	return p+q-1;					// return position to continue
}

// *************** Version ? ********************
#else

int replace_sub (char *x,char *z, int p, int q) {
	printf("\n*** Makro #myversion wurde illegal definiert ***\n\n");
	return 0;
}

#endif

/* ========== eof replace_string.cpp ========== */

    Source: geocities.com/pstrainer/entwicklung/c/aufgaben

               ( geocities.com/pstrainer/entwicklung/c)                   ( geocities.com/pstrainer/entwicklung)                   ( geocities.com/pstrainer)