Hello.

i wrote a program to do the following:

Given two strings S1 and S2. Delete from S2 all those characters which occur in S1 also and finally create a clean S2 with the relevant characters deleted.

This is what i tried:

void trimString()
{
	char s1[] = "hello world";
	char s2[] = "el";
	int i, j;

	for (i = 0; i < (signed)strlen(s1); i++) {
		for (j = 0; j < (signed)strlen(s2); j++) {
			if (s1[i] == s2[j]) {
				s1[i] = -1;
				break;
			}
		}
	}
	for (i = 0, j = 0; i < (signed)strlen(s1); i++) {
		if (s1[i] != -1) {
			s1[j] = s1[i];
			j++;
		}
	}
	s1[j] = '\0';
	printf("\nString is%s", s1);
}

Can i further improve it in any way?

Thanks.

Recommended Answers

One way to do it is to use another character array to copy all the characters in s1 that are not in s2.

void trimString()
{
   char s1[] = "hello world";
   char s2[] = "el";
   char s3[255] = {0};
   size_t sz1 = strlen(s1);
   size_t j = 0; …
Jump to Post


Can i further improve it in any way?

Thanks.

Yes. See the comments I added:

void trimString()
{
	char s1[] = "hello world";
	char s2[] = "el";
	int i, j;

	/* Do not use strlen() as a loop parameter.  
	   Use it to load a variable before …
Jump to Post

All 6 Replies

One way to do it is to use another character array to copy all the characters in s1 that are not in s2.

void trimString()
{
   char s1[] = "hello world";
   char s2[] = "el";
   char s3[255] = {0};
   size_t sz1 = strlen(s1);
   size_t j = 0;
   for(size_t i = 0; i < sz1; i++)
   {
       if( !strchr(s2,s1[i]) )
          s3[j++] = s1[i];
   }
}

@AncientDragon

Thanks for the reply.

Well, doesnt

if( !strchr(s2,s1[i]) )

take same time as

for (j = 0; j < (signed)strlen(s2); j++) {
	if (s1[i] == s2[j]) {
		s1[i] = -1;
		break;
	}
}

i was hoping to make the running time better.


Can i further improve it in any way?

Thanks.

Yes. See the comments I added:

void trimString()
{
	char s1[] = "hello world";
	char s2[] = "el";
	int i, j;

	/* Do not use strlen() as a loop parameter.  
	   Use it to load a variable before the loop and use 
	   the variable in the loop definition */
	/* Why are you casting the value to signed? Define the loop 
	   parameter variables as unsigned if you think it's necessary */
	for (i = 0; i < (signed)strlen(s1); i++) {
		for (j = 0; j < (signed)strlen(s2); j++) {
			if (s1[i] == s2[j]) {
				s1[i] = -1;   // this is good
				break;
			}
		}
	}
	for (i = 0, j = 0; i < (signed)strlen(s1); i++) {
		if (s1[i] != -1) {
			s1[j] = s1[i];
			j++;
		}
	}
	s1[j] = '\0';
	printf("\nString is%s", s1);
}

>>take same time as

Not necessarily, depending on how the compiler implements strchr() function. calling strlen() on every loop iteration is very very time consuming and I doubt any compiler will implement strchr() with that. On Intel compatible x86 processors compilers can use a processor instruction to do it.

You could take the hash map route

Thanks for the replies.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts learning and sharing knowledge.