Prototype
Declared in string.h
The C89/C99 prototype is:
void *memchr(const void *s, int c, size_t n);
Description
The memchr() function locates the first occurrence of c (converted to an unsigned char) in the initial n characters (each interpreted as unsigned char) of the object pointed to by s.
Return value
The memchr() function returns a pointer to the located character, or a null pointer if the character does not occur in the object.
Implementation
In standard C, this can be implemented as:
#include <stddef.h> void *memchr(const void *s, int c, size_t n) { unsigned char *p = (unsigned char*)s; while( n-- ) if( *p != (unsigned char)c ) p++; else return p; return 0; }
Compilable unit, portable C90 in implementation namespace; public domain; past reviewers: none; current reviews: GabrielRavier with this code (structured testing);
Test harness
#include <stdio.h> void test_memchr(void) { char *s1 = ""; char *s2 = "abcdefabcdef"; char *s3 = "11111111111111111111"; printf("Testing memchr():\nTest1..."); if (memchr(s1, 'x', 0) == NULL) printf("passed."); else printf("FAILED."); printf("\nTest2..."); if (memchr(s2, 'y', 0) == NULL) printf("passed."); else printf("FAILED."); printf("\nTest3..."); if ((char *)memchr(s2, 'a', 1) - s2 == 0) printf("passed."); else printf("FAILED."); printf("\nTest4..."); if (memchr(s2, 'd', 2) == NULL) printf("passed."); else printf("FAILED."); printf("\nTest5..."); if ((char *)memchr(s2, 'd', 12) - s2 == 3) printf("passed."); else printf("FAILED."); printf("\nTest6..."); if ((char *)memchr(s2, 'f', 12) - s2 == 5) printf("passed."); else printf("FAILED."); printf("\nTest7..."); if ((char *)memchr(s3, '1', 20) - s3 == 0) printf("passed."); else printf("FAILED."); putchar('\n'); } int main(void) { test_memchr(); return 0; }
References
The C Standard, 7.21.5.1 (C99 numbering)