Google Answers Logo
View Question
 
Q: Help with strchr() and strrchr()... ( Answered 5 out of 5 stars,   0 Comments )
Question  
Subject: Help with strchr() and strrchr()...
Category: Computers > Programming
Asked by: zefyre-ga
List Price: $5.00
Posted: 10 Feb 2004 06:28 PST
Expires: 11 Mar 2004 06:28 PST
Question ID: 305348
Hi,

In a previous question, hammer-ga wrote the following function for me...

char *es_strrclip_pointer(char needle, char *haystack) 
{
char  	*endpos;
char 	*retval;

	retval = NULL;
	if(haystack != NULL)
	{
		retval = (char *)strdup(haystack);
		if(retval != NULL)
		{
			endpos = strrchr(retval, needle);
			if(endpos != NULL)
			{
				endpos++;
				*endpos = '\0';
			}
			else
			{
				retval = NULL;
				fprintf(stderr, "Needle not found in Haystack.\n");
			}
		}
		else
		{
			fprintf(stderr, "Strdup failed.\n");
		}
	}
	else
	{
		fprintf(stderr, "Haystack is NULL.\n");
	}
	return(retval);
}

I was wondering if I could get a commented version of this, so I can
get a better grip on how it works.

Thanks!
-- Quinn
Answer  
Subject: Re: Help with strchr() and strrchr()...
Answered By: majortom-ga on 10 Feb 2004 06:56 PST
Rated:5 out of 5 stars
 
Here you are:

* * * Cut Here * * *

char *es_strrclip_pointer(char needle, char *haystack) 
{
char  	*endpos;
char 	*retval;
        /* Initialize return value to null */
	retval = NULL;
        /* Make sure haystack is not null */
	if(haystack != NULL)
	{
                /* Allocate a copy of the haystack string; strdup
                ** is equivalent to:
                ** char *copy = malloc(strlen(s) + 1);
                ** strcpy(copy, s);
                */
		retval = (char *)strdup(haystack);
                /* Make sure memory allocation did not fail
		if(retval != NULL)
		{
                        /* strrchr returns a pointer to the LAST occurrence
                        ** of 'needle' in 'retval' (our copy of haystack)
                        */ 
			endpos = strrchr(retval, needle);
                        /* If the needle was found... */
			if(endpos != NULL)
			{
                                /* Move one character PAST needle... */
				endpos++;
                                /* And make that character a null, ending
                                ** the string at that point. retval is now a
                                ** copy of haystack up to and including
                                ** needle 
                                */
				*endpos = '\0';
			}
			else
			{
                                /* No needle in the haystack */
				retval = NULL;
				fprintf(stderr, "Needle not found in Haystack.\n");
			}
		}
		else
		{
                        /* Memory allocation failure */
			fprintf(stderr, "Strdup failed.\n");
		}
	}
	else
	{
                /* Haystack was a null pointer, not a valid string */
		fprintf(stderr, "Haystack is NULL.\n");
	}
        /* Return our copy of haystack up to and including needle.
        ** Returned string should eventually be freed with free() by caller
        */
	return(retval);
}
zefyre-ga rated this answer:5 out of 5 stars and gave an additional tip of: $2.50
Thanks for the quick response!  The comments to the code were very
easy to understand, and cleared up everything I had been wondering
about.  Great job!

Comments  
There are no comments at this time.

Important Disclaimer: Answers and comments provided on Google Answers are general information, and are not intended to substitute for informed professional medical, psychiatric, psychological, tax, legal, investment, accounting, or other professional advice. Google does not endorse, and expressly disclaims liability for any product, manufacturer, distributor, service or service provider mentioned or any opinion expressed in answers or comments. Please read carefully the Google Answers Terms of Service.

If you feel that you have found inappropriate content, please let us know by emailing us at answers-support@google.com with the question ID listed above. Thank you.
Search Google Answers for
Google Answers  


Google Home - Answers FAQ - Terms of Service - Privacy Policy