home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #16 / NN_1992_16.iso / spool / comp / lang / c / 11684 < prev    next >
Encoding:
Text File  |  1992-07-28  |  1.9 KB  |  66 lines

  1. Path: sparky!uunet!paladin.american.edu!darwin.sura.net!mips!swrinde!cs.utexas.edu!torn!utzoo!telly!druid!darcy
  2. From: darcy@druid.uucp (D'Arcy J.M. Cain)
  3. Newsgroups: comp.lang.c
  4. Subject: Re: HIgher problems at hand. HELP!
  5. Message-ID: <1992Jul28.180817.9388@druid.uucp>
  6. Date: 28 Jul 92 18:08:17 GMT
  7. References: <Brv6oD.Dq5@usenet.ucs.indiana.edu> <1992Jul25.142216.5636@druid.uucp> <24902@dog.ee.lbl.gov>
  8. Organization: D'Arcy Cain Consulting
  9. Lines: 55
  10.  
  11. torek@horse.ee.lbl.gov (Chris Torek) writes:
  12. >In article <1992Jul25.142216.5636@druid.uucp> darcy@druid.uucp
  13. >(D'Arcy J.M. Cain) writes:
  14. >> * strstr - find first occurrence of wanted in s
  15. >> *
  16. >> * based on code by Henry Spencer
  17. >> * modified for ANSI by D'Arcy J.M. Cain
  18. >> */
  19. >The given strstr() fails to meet the second sentence under `Returns'
  20. >in the ANSI C standard description of strstr() (line 25, p. 168):
  21. >
  22. >    If |s2| points to a string with zero length, the function
  23. >    returns |s1|.
  24.  
  25. Oops.  That's right.  The culprit is the optimization attempt in the
  26. while statement:
  27.  
  28.     while (*s != firstc || strncmp(s, wanted, len) != 0)
  29.  
  30. Should be:
  31.  
  32.     while (strncmp(s, wanted, len) != 0)
  33.  
  34. Or the simpler:
  35.  
  36.     while (strncmp(s, wanted, len))
  37.  
  38. This depends on strncmp returning equal on zero length strings.  I am
  39. pretty sure that the standard requires this.  It certainly strongly
  40. implies it.  Perhaps this needs a clarification.
  41.  
  42. So the new version, without the "peculiar" define, is:
  43.  
  44. -------------------------------------------------------
  45. #include    <string.h>
  46.  
  47. char    *strstr(const char *s, const char *wanted)
  48. {
  49.     size_t len = strlen(wanted);
  50.  
  51.     while (strncmp(s, wanted, len))
  52.         if (*s++ == '\0')
  53.             return(NULL);
  54.  
  55.     return(s);
  56. }
  57. --------------------------------------------------------
  58.  
  59. Kluge to taste for warning suppression.
  60.  
  61. -- 
  62. D'Arcy J.M. Cain (darcy@druid.com)  |
  63. D'Arcy Cain Consulting              |   There's no government
  64. Toronto, Ontario, Canada            |   like no government!
  65. +1 416 424 2871          DoD#0082   |
  66.