[comp.lang.c] EXPLODE ROUTINE

sah@gnu.ai.mit.edu (Tarador) (04/30/91)

   The following program is akin to the MUF primitive EXPLODE, if any of
you are familiar with MUCK.  Anyway, it works like this:
   x = explode(char *data, char *trigger, char **array);
  Where x is an int, *data is a a data string, *trigger is the string to
explode on, and **array is filled by results.
  So,  x = explode("Hello.Test", ".", results);
 That SHOULD put "Hello" in results[0] and "Test" in results[1].  But,
for some reason, I keep getting a bus error.  Program follows:

int explode();
main()
{
	int c,cc;
	char **arr, x[50], trig[5];

	gets(x); gets(trig);
	cc = explode(x, trig, arr);
	for (c=0;c<cc;++c)
		printf("%s\n", arr[c]);
}
int explode(char *data, char *trigger, char **array)
{
	int x;
	int last=0, ctr=0;
	char dummy[512];

	for (x=0;x<strlen(data);++x)	{
		if (!strncmp(&data[x], trigger, strlen(trigger)))	{
/* Here's the bus error*/  strncpy(array[ctr], &data[last], x);
			last = x+strlen(trigger);
			++ ctr;
		}
	}
	return ctr;
}

  Please post suggestions, etc., to sah@gnu.ai.mit.edu.  Thanks.
--
+-------------------------------------------------------------------------+
| Tarador Dranon                       MIT: sah@gnu.ai.mit.edu            |
|             C-Guild: vidco%cguild%valnet@iuvax.cs.indiana.edu           |
+-------------------------------------------------------------------------+

halloran@sldv21.mdcbbs.com (05/03/91)

In article <15431@life.ai.mit.edu>, sah@gnu.ai.mit.edu (Tarador) writes:
>
>    The following program is akin to the MUF primitive EXPLODE, if any of
> you are familiar with MUCK.  Anyway, it works like this:
>    x = explode(char *data, char *trigger, char **array);
>   Where x is an int, *data is a a data string, *trigger is the string to
> explode on, and **array is filled by results.
>   So,  x = explode("Hello.Test", ".", results);
>  That SHOULD put "Hello" in results[0] and "Test" in results[1].  But,
> for some reason, I keep getting a bus error.  Program follows:
> 
> int explode();
> main()
> {
> 	int c,cc;
> 	char **arr, x[50], trig[5];
> 
> 	gets(x); gets(trig);
> 	cc = explode(x, trig, arr); 
> 	for (c=0;c<cc;++c)
> 		printf("%s\n", arr[c]);
> }
> int explode(char *data, char *trigger, char **array)
> {
> 	int x;
> 	int last=0, ctr=0;
> 	char dummy[512];
> 
> 	for (x=0;x<strlen(data);++x)	{
> 		if (!strncmp(&data[x], trigger, strlen(trigger)))	{
> /* Here's the bus error*/  strncpy(array[ctr], &data[last], x);

	You have failed to allocate memory into which you wish to copy.
	array (or main::arr), is typed as a pointer to a pointer to char
	but where does it point???  Anywhere!  You have not initialized
	the pointer to valid memory.

> 			last = x+strlen(trigger);
> 			++ ctr;
> 		}
> 	}
> 	return ctr;
> }
> 
>   Please post suggestions, etc., to sah@gnu.ai.mit.edu.  Thanks.
> --
> +-------------------------------------------------------------------------+
> | Tarador Dranon                       MIT: sah@gnu.ai.mit.edu            |
> |             C-Guild: vidco%cguild%valnet@iuvax.cs.indiana.edu           |
> +-------------------------------------------------------------------------+
-- 

	Mark J. Halloran      |    Voice: (314) 233-6973
	McDonnell Douglas M&E |      Fax: (314) 232-8698
	Dept C705 MC 3065386  | Internet: halloran@sldev1.mdcbbs.com
	St. Louis, Mo. 63166  |     UUCP: uunet!sldev1.mdcbbs!halloran