/* * Program to show how various string handling calls behave when given a nul ('\0') to find in a * string. * * Author: James Hunt (james.hunt-GeWIH/nMZzLQT0dZR+AlfA@public.gmane.org) */ /* for strchrnul() */ #define _GNU_SOURCE #include #include #include #include #include #include int main(int argc, char *argv[]) { size_t len; char c; char *sp; char string[] = "foo bar. Hello, world!"; len = strlen(string); fprintf(stderr, "string='%s' (len=%d, start=%p, end=%p ['%c'], nul=%p ['%c'])\n\n", string, (int)len, string, string+len-1, *(string+len-1), string+len, *(string+len)); c = 'f'; sp = "f"; fprintf(stderr, "strchr ('%s', '%c') returned %p\n", string, c, strchr(string, c)); fprintf(stderr, "memchr ('%s', '%c', strlen(s)) returned %p\n", string, c, memchr(string, c, strlen(string))); fprintf(stderr, "memchr ('%s', '%c', 1+strlen(s)) returned %p\n", string, c, memchr(string, c, 1+strlen(string))); fprintf(stderr, "strrchr ('%s', '%c') returned %p\n", string, c, strrchr(string, c)); fprintf(stderr, "strchrnul ('%s', '%c') returned %p\n", string, c, strchrnul(string, c)); fprintf(stderr, "strstr ('%s', '%s') returned %p\n", string, sp, strstr(string, sp)); fputc ('\n', stderr); c = 'o'; sp = "o"; fprintf(stderr, "strchr ('%s', '%c') returned %p\n", string, c, strchr(string, c)); fprintf(stderr, "memchr ('%s', '%c', strlen(s)) returned %p\n", string, c, memchr(string, c, strlen(string))); fprintf(stderr, "memchr ('%s', '%c', 1+strlen(s)) returned %p\n", string, c, memchr(string, c, 1+strlen(string))); fprintf(stderr, "strrchr ('%s', '%c') returned %p\n", string, c, strrchr(string, c)); fprintf(stderr, "strchrnul ('%s', '%c') returned %p\n", string, c, strchrnul(string, c)); fprintf(stderr, "strstr ('%s', '%s') returned %p\n", string, sp, strstr(string, sp)); fputc ('\n', stderr); c = '!'; sp = "!"; fprintf(stderr, "strchr ('%s', '%c') returned %p\n", string, c, strchr(string, c)); fprintf(stderr, "memchr ('%s', '%c', strlen(s)) returned %p\n", string, c, memchr(string, c, strlen(string))); fprintf(stderr, "memchr ('%s', '%c', 1+strlen(s)) returned %p\n", string, c, memchr(string, c, 1+strlen(string))); fprintf(stderr, "strrchr ('%s', '%c') returned %p\n", string, c, strrchr(string, c)); fprintf(stderr, "strchrnul ('%s', '%c') returned %p\n", string, c, strchrnul(string, c)); fprintf(stderr, "strstr ('%s', '%s') returned %p\n", string, sp, strstr(string, sp)); fputc ('\n', stderr); c = '\0'; sp = ""; fprintf(stderr, "strchr ('%s', '%c') returned %p\n", string, c, strchr(string, c)); fprintf(stderr, "memchr ('%s', '%c', strlen(s)) returned %p\n", string, c, memchr(string, c, strlen(string))); fprintf(stderr, "memchr ('%s', '%c', 1+strlen(s)) returned %p\n", string, c, memchr(string, c, 1+strlen(string))); fprintf(stderr, "strrchr ('%s', '%c') returned %p\n", string, c, strrchr(string, c)); fprintf(stderr, "strchrnul ('%s', '%c') returned %p\n", string, c, strchrnul(string, c)); fprintf(stderr, "strstr ('%s', '%s') returned %p\n", string, sp, strstr(string, sp)); sp = "\0"; fprintf(stderr, "strstr ('%s', '%s') returned %p\n", string, sp, strstr(string, sp)); /* XXX: not valid calls */ #if 0 fprintf(stderr, "strstr (NULL, '%s') returned %p\n", "X", strstr(NULL, "X")); fprintf(stderr, "strstr (NULL, '%s') returned %p\n", "\0", strstr(NULL, "\0")); fprintf(stderr, "strstr ('%s', NULL) returned %p\n", string, strstr(string, NULL)); /* XXX: core dumps */ #endif fputc ('\n', stderr); c = 'Z'; sp = "Z"; fprintf(stderr, "strchr ('%s', '%c') returned %p\n", string, c, strchr(string, c)); fprintf(stderr, "memchr ('%s', '%c', strlen(s)) returned %p\n", string, c, memchr(string, c, strlen(string))); fprintf(stderr, "memchr ('%s', '%c', 1+strlen(s)) returned %p\n", string, c, memchr(string, c, 1+strlen(string))); fprintf(stderr, "strrchr ('%s', '%c') returned %p\n", string, c, strrchr(string, c)); fprintf(stderr, "strchrnul ('%s', '%c') returned %p\n", string, c, strchrnul(string, c)); fprintf(stderr, "strstr ('%s', '%s') returned %p\n", string, sp, strstr(string, sp)); exit(EXIT_SUCCESS); }