PEJI.IR

پیاده سازی نهایی string

۱۴۰۱ مهر ۱۴, پنجشنبه ساعت ۱۴:۴۰

پیاده سازی نهایی به شکل زیر شد :

#include <stdio.h>
#include <stdlib.h>

typedef struct {
	char **strings;
	int *types;
	int i;
} string;

string_init( string *str ) {
	str = malloc( sizeof( string ) );
	str->i = 0;
	str->strings = malloc( sizeof( char *) * (2) );
	str->types = malloc( sizeof( int *) * (2) );
	return str;
}

string_concat( string *a, string *b) {
	string *r;
	r = string_init( r );
	string_append1( r, a );
	string_append1( r, b );
	return r;
}

string_append( string *str, char *str1 ) {
	str->strings = realloc( str->strings, sizeof( char *) * ( str->i + 2 ) );
	str->types = realloc( str->types, sizeof( int *) * ( str->i + 2 ) );
	str->types[str->i] = 1;
	str->strings[str->i++] = str1;
}

string_append1( string *str, string *str1 ) {
	str->strings = realloc( str->strings, sizeof( char *) * ( str->i + 2 ) );
	str->types = realloc( str->types, sizeof( int *) * ( str->i + 2 ) );
	str->types[str->i] = 2;
	str->strings[str->i++] = str1;
}

string_print( string *str ) {
	for( int i = 0; i < str->i; i++ ) {
		if( str->types[i] == 1 ) {
			printf("%s", str->strings[i]);
		} else {
			string_print( str->strings[i] );
		}
	}
}

string_len( string *str ) {
	size_t len = 0;
	for( int i = 0; i < str->i; i++ ) {
		len += strlen(str->strings[i]);
	}
	return len;
}

main() {

	string *str;
	str = string_init( str );

	string *str1;
	str1 = string_init( str1 );
	string_append( str1, "abc");


	string *str2;
	str2 = string_init( str2 );
	string_append( str2, "defghijklmnñopqrstuvwxyz");

	for(int i = 0; i < 30000; i++) {
		str = string_concat( str1, str );
		str = string_concat( str, str2 );
	}

	string_print( str );
}

این خروجی با همون performance کامپایلر v8 هست.