blob: d31ae8b5662d126671c5998aafd2cadbf7baa3c3 [file] [log] [blame]
<html lang="en">
<head>
<title>Search Functions - The GNU C Library</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="The GNU C Library">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="String-and-Array-Utilities.html#String-and-Array-Utilities" title="String and Array Utilities">
<link rel="prev" href="Collation-Functions.html#Collation-Functions" title="Collation Functions">
<link rel="next" href="Finding-Tokens-in-a-String.html#Finding-Tokens-in-a-String" title="Finding Tokens in a String">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
This file documents the GNU C library.
This is Edition 0.12, last updated 2007-10-27,
of `The GNU C Library Reference Manual', for version
2.8 (Sourcery G++ Lite 2011.03-41).
Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002,
2003, 2007, 2008, 2010 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Free Software Needs Free Documentation''
and ``GNU Lesser General Public License'', the Front-Cover texts being
``A GNU Manual'', and with the Back-Cover Texts as in (a) below. A
copy of the license is included in the section entitled "GNU Free
Documentation License".
(a) The FSF's Back-Cover Text is: ``You have the freedom to
copy and modify this GNU manual. Buying copies from the FSF
supports it in developing GNU and promoting software freedom.''-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
pre.display { font-family:inherit }
pre.format { font-family:inherit }
pre.smalldisplay { font-family:inherit; font-size:smaller }
pre.smallformat { font-family:inherit; font-size:smaller }
pre.smallexample { font-size:smaller }
pre.smalllisp { font-size:smaller }
span.sc { font-variant:small-caps }
span.roman { font-family:serif; font-weight:normal; }
span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
<link rel="stylesheet" type="text/css" href="../cs.css">
</head>
<body>
<div class="node">
<a name="Search-Functions"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Finding-Tokens-in-a-String.html#Finding-Tokens-in-a-String">Finding Tokens in a String</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="Collation-Functions.html#Collation-Functions">Collation Functions</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="String-and-Array-Utilities.html#String-and-Array-Utilities">String and Array Utilities</a>
<hr>
</div>
<h3 class="section">5.7 Search Functions</h3>
<p>This section describes library functions which perform various kinds
of searching operations on strings and arrays. These functions are
declared in the header file <samp><span class="file">string.h</span></samp>.
<a name="index-string_002eh-542"></a><a name="index-search-functions-_0028for-strings_0029-543"></a><a name="index-string-search-functions-544"></a>
<!-- string.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: void * <b>memchr</b> (<var>const void *block, int c, size_t size</var>)<var><a name="index-memchr-545"></a></var><br>
<blockquote><p>This function finds the first occurrence of the byte <var>c</var> (converted
to an <code>unsigned char</code>) in the initial <var>size</var> bytes of the
object beginning at <var>block</var>. The return value is a pointer to the
located byte, or a null pointer if no match was found.
</p></blockquote></div>
<!-- wchar.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: wchar_t * <b>wmemchr</b> (<var>const wchar_t *block, wchar_t wc, size_t size</var>)<var><a name="index-wmemchr-546"></a></var><br>
<blockquote><p>This function finds the first occurrence of the wide character <var>wc</var>
in the initial <var>size</var> wide characters of the object beginning at
<var>block</var>. The return value is a pointer to the located wide
character, or a null pointer if no match was found.
</p></blockquote></div>
<!-- string.h -->
<!-- GNU -->
<div class="defun">
&mdash; Function: void * <b>rawmemchr</b> (<var>const void *block, int c</var>)<var><a name="index-rawmemchr-547"></a></var><br>
<blockquote><p>Often the <code>memchr</code> function is used with the knowledge that the
byte <var>c</var> is available in the memory block specified by the
parameters. But this means that the <var>size</var> parameter is not really
needed and that the tests performed with it at runtime (to check whether
the end of the block is reached) are not needed.
<p>The <code>rawmemchr</code> function exists for just this situation which is
surprisingly frequent. The interface is similar to <code>memchr</code> except
that the <var>size</var> parameter is missing. The function will look beyond
the end of the block pointed to by <var>block</var> in case the programmer
made an error in assuming that the byte <var>c</var> is present in the block.
In this case the result is unspecified. Otherwise the return value is a
pointer to the located byte.
<p>This function is of special interest when looking for the end of a
string. Since all strings are terminated by a null byte a call like
<pre class="smallexample"> rawmemchr (str, '\0')
</pre>
<p class="noindent">will never go beyond the end of the string.
<p>This function is a GNU extension.
</p></blockquote></div>
<!-- string.h -->
<!-- GNU -->
<div class="defun">
&mdash; Function: void * <b>memrchr</b> (<var>const void *block, int c, size_t size</var>)<var><a name="index-memrchr-548"></a></var><br>
<blockquote><p>The function <code>memrchr</code> is like <code>memchr</code>, except that it searches
backwards from the end of the block defined by <var>block</var> and <var>size</var>
(instead of forwards from the front).
<p>This function is a GNU extension.
</p></blockquote></div>
<!-- string.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: char * <b>strchr</b> (<var>const char *string, int c</var>)<var><a name="index-strchr-549"></a></var><br>
<blockquote><p>The <code>strchr</code> function finds the first occurrence of the character
<var>c</var> (converted to a <code>char</code>) in the null-terminated string
beginning at <var>string</var>. The return value is a pointer to the located
character, or a null pointer if no match was found.
<p>For example,
<pre class="smallexample"> strchr ("hello, world", 'l')
&rArr; "llo, world"
strchr ("hello, world", '?')
&rArr; NULL
</pre>
<p>The terminating null character is considered to be part of the string,
so you can use this function get a pointer to the end of a string by
specifying a null character as the value of the <var>c</var> argument. It
would be better (but less portable) to use <code>strchrnul</code> in this
case, though.
</p></blockquote></div>
<!-- wchar.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: wchar_t * <b>wcschr</b> (<var>const wchar_t *wstring, int wc</var>)<var><a name="index-wcschr-550"></a></var><br>
<blockquote><p>The <code>wcschr</code> function finds the first occurrence of the wide
character <var>wc</var> in the null-terminated wide character string
beginning at <var>wstring</var>. The return value is a pointer to the
located wide character, or a null pointer if no match was found.
<p>The terminating null character is considered to be part of the wide
character string, so you can use this function get a pointer to the end
of a wide character string by specifying a null wude character as the
value of the <var>wc</var> argument. It would be better (but less portable)
to use <code>wcschrnul</code> in this case, though.
</p></blockquote></div>
<!-- string.h -->
<!-- GNU -->
<div class="defun">
&mdash; Function: char * <b>strchrnul</b> (<var>const char *string, int c</var>)<var><a name="index-strchrnul-551"></a></var><br>
<blockquote><p><code>strchrnul</code> is the same as <code>strchr</code> except that if it does
not find the character, it returns a pointer to string's terminating
null character rather than a null pointer.
<p>This function is a GNU extension.
</p></blockquote></div>
<!-- wchar.h -->
<!-- GNU -->
<div class="defun">
&mdash; Function: wchar_t * <b>wcschrnul</b> (<var>const wchar_t *wstring, wchar_t wc</var>)<var><a name="index-wcschrnul-552"></a></var><br>
<blockquote><p><code>wcschrnul</code> is the same as <code>wcschr</code> except that if it does not
find the wide character, it returns a pointer to wide character string's
terminating null wide character rather than a null pointer.
<p>This function is a GNU extension.
</p></blockquote></div>
<p>One useful, but unusual, use of the <code>strchr</code>
function is when one wants to have a pointer pointing to the NUL byte
terminating a string. This is often written in this way:
<pre class="smallexample"> s += strlen (s);
</pre>
<p class="noindent">This is almost optimal but the addition operation duplicated a bit of
the work already done in the <code>strlen</code> function. A better solution
is this:
<pre class="smallexample"> s = strchr (s, '\0');
</pre>
<p>There is no restriction on the second parameter of <code>strchr</code> so it
could very well also be the NUL character. Those readers thinking very
hard about this might now point out that the <code>strchr</code> function is
more expensive than the <code>strlen</code> function since we have two abort
criteria. This is right. But in the GNU C library the implementation of
<code>strchr</code> is optimized in a special way so that <code>strchr</code>
actually is faster.
<!-- string.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: char * <b>strrchr</b> (<var>const char *string, int c</var>)<var><a name="index-strrchr-553"></a></var><br>
<blockquote><p>The function <code>strrchr</code> is like <code>strchr</code>, except that it searches
backwards from the end of the string <var>string</var> (instead of forwards
from the front).
<p>For example,
<pre class="smallexample"> strrchr ("hello, world", 'l')
&rArr; "ld"
</pre>
</blockquote></div>
<!-- wchar.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: wchar_t * <b>wcsrchr</b> (<var>const wchar_t *wstring, wchar_t c</var>)<var><a name="index-wcsrchr-554"></a></var><br>
<blockquote><p>The function <code>wcsrchr</code> is like <code>wcschr</code>, except that it searches
backwards from the end of the string <var>wstring</var> (instead of forwards
from the front).
</p></blockquote></div>
<!-- string.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: char * <b>strstr</b> (<var>const char *haystack, const char *needle</var>)<var><a name="index-strstr-555"></a></var><br>
<blockquote><p>This is like <code>strchr</code>, except that it searches <var>haystack</var> for a
substring <var>needle</var> rather than just a single character. It
returns a pointer into the string <var>haystack</var> that is the first
character of the substring, or a null pointer if no match was found. If
<var>needle</var> is an empty string, the function returns <var>haystack</var>.
<p>For example,
<pre class="smallexample"> strstr ("hello, world", "l")
&rArr; "llo, world"
strstr ("hello, world", "wo")
&rArr; "world"
</pre>
</blockquote></div>
<!-- wchar.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: wchar_t * <b>wcsstr</b> (<var>const wchar_t *haystack, const wchar_t *needle</var>)<var><a name="index-wcsstr-556"></a></var><br>
<blockquote><p>This is like <code>wcschr</code>, except that it searches <var>haystack</var> for a
substring <var>needle</var> rather than just a single wide character. It
returns a pointer into the string <var>haystack</var> that is the first wide
character of the substring, or a null pointer if no match was found. If
<var>needle</var> is an empty string, the function returns <var>haystack</var>.
</p></blockquote></div>
<!-- wchar.h -->
<!-- XPG -->
<div class="defun">
&mdash; Function: wchar_t * <b>wcswcs</b> (<var>const wchar_t *haystack, const wchar_t *needle</var>)<var><a name="index-wcswcs-557"></a></var><br>
<blockquote><p><code>wcswcs</code> is an deprecated alias for <code>wcsstr</code>. This is the
name originally used in the X/Open Portability Guide before the
Amendment&nbsp;1<!-- /@w --> to ISO&nbsp;C90<!-- /@w --> was published.
</p></blockquote></div>
<!-- string.h -->
<!-- GNU -->
<div class="defun">
&mdash; Function: char * <b>strcasestr</b> (<var>const char *haystack, const char *needle</var>)<var><a name="index-strcasestr-558"></a></var><br>
<blockquote><p>This is like <code>strstr</code>, except that it ignores case in searching for
the substring. Like <code>strcasecmp</code>, it is locale dependent how
uppercase and lowercase characters are related.
<p>For example,
<pre class="smallexample"> strcasestr ("hello, world", "L")
&rArr; "llo, world"
strcasestr ("hello, World", "wo")
&rArr; "World"
</pre>
</blockquote></div>
<!-- string.h -->
<!-- GNU -->
<div class="defun">
&mdash; Function: void * <b>memmem</b> (<var>const void *haystack, size_t haystack-len,<br>const void *needle, size_t needle-len</var>)<var><a name="index-memmem-559"></a></var><br>
<blockquote><p>This is like <code>strstr</code>, but <var>needle</var> and <var>haystack</var> are byte
arrays rather than null-terminated strings. <var>needle-len</var> is the
length of <var>needle</var> and <var>haystack-len</var> is the length of
<var>haystack</var>.
<p>This function is a GNU extension.
</p></blockquote></div>
<!-- string.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: size_t <b>strspn</b> (<var>const char *string, const char *skipset</var>)<var><a name="index-strspn-560"></a></var><br>
<blockquote><p>The <code>strspn</code> (&ldquo;string span&rdquo;) function returns the length of the
initial substring of <var>string</var> that consists entirely of characters that
are members of the set specified by the string <var>skipset</var>. The order
of the characters in <var>skipset</var> is not important.
<p>For example,
<pre class="smallexample"> strspn ("hello, world", "abcdefghijklmnopqrstuvwxyz")
&rArr; 5
</pre>
<p>Note that &ldquo;character&rdquo; is here used in the sense of byte. In a string
using a multibyte character encoding (abstract) character consisting of
more than one byte are not treated as an entity. Each byte is treated
separately. The function is not locale-dependent.
</p></blockquote></div>
<!-- wchar.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: size_t <b>wcsspn</b> (<var>const wchar_t *wstring, const wchar_t *skipset</var>)<var><a name="index-wcsspn-561"></a></var><br>
<blockquote><p>The <code>wcsspn</code> (&ldquo;wide character string span&rdquo;) function returns the
length of the initial substring of <var>wstring</var> that consists entirely
of wide characters that are members of the set specified by the string
<var>skipset</var>. The order of the wide characters in <var>skipset</var> is not
important.
</p></blockquote></div>
<!-- string.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: size_t <b>strcspn</b> (<var>const char *string, const char *stopset</var>)<var><a name="index-strcspn-562"></a></var><br>
<blockquote><p>The <code>strcspn</code> (&ldquo;string complement span&rdquo;) function returns the length
of the initial substring of <var>string</var> that consists entirely of characters
that are <em>not</em> members of the set specified by the string <var>stopset</var>.
(In other words, it returns the offset of the first character in <var>string</var>
that is a member of the set <var>stopset</var>.)
<p>For example,
<pre class="smallexample"> strcspn ("hello, world", " \t\n,.;!?")
&rArr; 5
</pre>
<p>Note that &ldquo;character&rdquo; is here used in the sense of byte. In a string
using a multibyte character encoding (abstract) character consisting of
more than one byte are not treated as an entity. Each byte is treated
separately. The function is not locale-dependent.
</p></blockquote></div>
<!-- wchar.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: size_t <b>wcscspn</b> (<var>const wchar_t *wstring, const wchar_t *stopset</var>)<var><a name="index-wcscspn-563"></a></var><br>
<blockquote><p>The <code>wcscspn</code> (&ldquo;wide character string complement span&rdquo;) function
returns the length of the initial substring of <var>wstring</var> that
consists entirely of wide characters that are <em>not</em> members of the
set specified by the string <var>stopset</var>. (In other words, it returns
the offset of the first character in <var>string</var> that is a member of
the set <var>stopset</var>.)
</p></blockquote></div>
<!-- string.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: char * <b>strpbrk</b> (<var>const char *string, const char *stopset</var>)<var><a name="index-strpbrk-564"></a></var><br>
<blockquote><p>The <code>strpbrk</code> (&ldquo;string pointer break&rdquo;) function is related to
<code>strcspn</code>, except that it returns a pointer to the first character
in <var>string</var> that is a member of the set <var>stopset</var> instead of the
length of the initial substring. It returns a null pointer if no such
character from <var>stopset</var> is found.
<!-- @group Invalid outside the example. -->
<p>For example,
<pre class="smallexample"> strpbrk ("hello, world", " \t\n,.;!?")
&rArr; ", world"
</pre>
<!-- @end group -->
<p>Note that &ldquo;character&rdquo; is here used in the sense of byte. In a string
using a multibyte character encoding (abstract) character consisting of
more than one byte are not treated as an entity. Each byte is treated
separately. The function is not locale-dependent.
</p></blockquote></div>
<!-- wchar.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: wchar_t * <b>wcspbrk</b> (<var>const wchar_t *wstring, const wchar_t *stopset</var>)<var><a name="index-wcspbrk-565"></a></var><br>
<blockquote><p>The <code>wcspbrk</code> (&ldquo;wide character string pointer break&rdquo;) function is
related to <code>wcscspn</code>, except that it returns a pointer to the first
wide character in <var>wstring</var> that is a member of the set
<var>stopset</var> instead of the length of the initial substring. It
returns a null pointer if no such character from <var>stopset</var> is found.
</p></blockquote></div>
<h4 class="subsection">5.7.1 Compatibility String Search Functions</h4>
<!-- string.h -->
<!-- BSD -->
<div class="defun">
&mdash; Function: char * <b>index</b> (<var>const char *string, int c</var>)<var><a name="index-index-566"></a></var><br>
<blockquote><p><code>index</code> is another name for <code>strchr</code>; they are exactly the same.
New code should always use <code>strchr</code> since this name is defined in
ISO&nbsp;C<!-- /@w --> while <code>index</code> is a BSD invention which never was available
on System&nbsp;V<!-- /@w --> derived systems.
</p></blockquote></div>
<!-- string.h -->
<!-- BSD -->
<div class="defun">
&mdash; Function: char * <b>rindex</b> (<var>const char *string, int c</var>)<var><a name="index-rindex-567"></a></var><br>
<blockquote><p><code>rindex</code> is another name for <code>strrchr</code>; they are exactly the same.
New code should always use <code>strrchr</code> since this name is defined in
ISO&nbsp;C<!-- /@w --> while <code>rindex</code> is a BSD invention which never was available
on System&nbsp;V<!-- /@w --> derived systems.
</p></blockquote></div>
</body></html>