|  | .TH STRCAT 3 | 
|  | .SH NAME | 
|  | strcat, strncat, strcmp, strncmp, cistrcmp, cistrncmp, strcpy, strncpy, strecpy, strlen, strchr, strrchr, strpbrk, strspn, strcspn, strtok, strdup, strstr, cistrstr \- string operations | 
|  | .SH SYNOPSIS | 
|  | .B #include <u.h> | 
|  | .br | 
|  | .B #include <libc.h> | 
|  | .PP | 
|  | .ta \w'\fLchar* \fP'u | 
|  | .B | 
|  | char*	strcat(char *s1, char *s2) | 
|  | .PP | 
|  | .B | 
|  | char*	strncat(char *s1, char *s2, long n) | 
|  | .PP | 
|  | .B | 
|  | int	strcmp(char *s1, char *s2) | 
|  | .PP | 
|  | .B | 
|  | int	strncmp(char *s1, char *s2, long n) | 
|  | .PP | 
|  | .B | 
|  | int	cistrcmp(char *s1, char *s2) | 
|  | .PP | 
|  | .B | 
|  | int	cistrncmp(char *s1, char *s2, long n) | 
|  | .PP | 
|  | .B | 
|  | char*	strcpy(char *s1, char *s2) | 
|  | .PP | 
|  | .B | 
|  | char*	strecpy(char *s1, char *es1, char *s2) | 
|  | .PP | 
|  | .B | 
|  | char*	strncpy(char *s1, char *s2, long n) | 
|  | .PP | 
|  | .B | 
|  | long	strlen(char *s) | 
|  | .PP | 
|  | .B | 
|  | char*	strchr(char *s, char c) | 
|  | .PP | 
|  | .B | 
|  | char*	strrchr(char *s, char c) | 
|  | .PP | 
|  | .B | 
|  | char*	strpbrk(char *s1, char *s2) | 
|  | .PP | 
|  | .B | 
|  | long	strspn(char *s1, char *s2) | 
|  | .PP | 
|  | .B | 
|  | long	strcspn(char *s1, char *s2) | 
|  | .PP | 
|  | .B | 
|  | char*	strtok(char *s1, char *s2) | 
|  | .PP | 
|  | .B | 
|  | char*	strdup(char *s) | 
|  | .PP | 
|  | .B | 
|  | char*	strstr(char *s1, char *s2) | 
|  | .PP | 
|  | .B | 
|  | char*	cistrstr(char *s1, char *s2) | 
|  | .SH DESCRIPTION | 
|  | The arguments | 
|  | .I s1, s2 | 
|  | and | 
|  | .I s | 
|  | point to null-terminated strings. | 
|  | The functions | 
|  | .IR strcat , | 
|  | .IR strncat , | 
|  | .IR strcpy , | 
|  | .IR strecpy , | 
|  | and | 
|  | .I strncpy | 
|  | all alter | 
|  | .IR s1 . | 
|  | .I Strcat | 
|  | and | 
|  | .I strcpy | 
|  | do not check for overflow of | 
|  | the array pointed to by | 
|  | .IR s1 . | 
|  | .PP | 
|  | .I Strcat | 
|  | appends a copy of string | 
|  | .I s2 | 
|  | to the end of string | 
|  | .IR s1 . | 
|  | .I Strncat | 
|  | appends at most | 
|  | .I n | 
|  | bytes. | 
|  | Each returns a pointer to the null-terminated result. | 
|  | .PP | 
|  | .I Strcmp | 
|  | compares its arguments and returns an integer | 
|  | less than, equal to, or greater than 0, | 
|  | according as | 
|  | .I s1 | 
|  | is lexicographically less than, equal to, or | 
|  | greater than | 
|  | .IR s2 . | 
|  | .I Strncmp | 
|  | makes the same comparison but examines at most | 
|  | .I n | 
|  | bytes. | 
|  | .I Cistrcmp | 
|  | and | 
|  | .I cistrncmp | 
|  | ignore ASCII case distinctions when comparing strings. | 
|  | The comparisons are made with unsigned bytes. | 
|  | .PP | 
|  | .I Strcpy | 
|  | copies string | 
|  | .I s2 | 
|  | to | 
|  | .IR s1 , | 
|  | stopping after the null byte has been copied. | 
|  | .I Strncpy | 
|  | copies exactly | 
|  | .I n | 
|  | bytes, | 
|  | truncating | 
|  | .I s2 | 
|  | or adding | 
|  | null bytes to | 
|  | .I s1 | 
|  | if necessary. | 
|  | The result will not be null-terminated if the length | 
|  | of | 
|  | .I s2 | 
|  | is | 
|  | .I n | 
|  | or more. | 
|  | Each function returns | 
|  | .IR s1 . | 
|  | .PP | 
|  | .I Strecpy | 
|  | copies bytes until a null byte has been copied, but writes no bytes beyond | 
|  | .IR es1 . | 
|  | If any bytes are copied, | 
|  | .I s1 | 
|  | is terminated by a null byte, and a pointer to that byte is returned. | 
|  | Otherwise, the original | 
|  | .I s1 | 
|  | is returned. | 
|  | .PP | 
|  | .I Strlen | 
|  | returns the number of bytes in | 
|  | .IR s , | 
|  | not including the terminating null byte. | 
|  | .PP | 
|  | .I Strchr | 
|  | .RI ( strrchr ) | 
|  | returns a pointer to the first (last) | 
|  | occurrence of byte | 
|  | .I c | 
|  | in string | 
|  | .IR s , | 
|  | or | 
|  | .L 0 | 
|  | if | 
|  | .I c | 
|  | does not occur in the string. | 
|  | The null byte terminating a string is considered to | 
|  | be part of the string. | 
|  | .PP | 
|  | .I Strpbrk | 
|  | returns a pointer to the first occurrence in string | 
|  | .I s1 | 
|  | of any byte from string | 
|  | .IR s2 , | 
|  | .L 0 | 
|  | if no byte from | 
|  | .I s2 | 
|  | exists in | 
|  | .IR s1 . | 
|  | .PP | 
|  | .I Strspn | 
|  | .RI ( strcspn ) | 
|  | returns the length of the initial segment of string | 
|  | .I s1 | 
|  | which consists entirely of bytes from (not from) string | 
|  | .IR s2 . | 
|  | .PP | 
|  | .I Strtok | 
|  | considers the string | 
|  | .I s1 | 
|  | to consist of a sequence of zero or more text tokens separated | 
|  | by spans of one or more bytes from the separator string | 
|  | .IR s2 . | 
|  | The first call, with pointer | 
|  | .I s1 | 
|  | specified, returns a pointer to the first byte of the first | 
|  | token, and will have written a | 
|  | null byte into | 
|  | .I s1 | 
|  | immediately following the returned token. | 
|  | The function | 
|  | keeps track of its position in the string | 
|  | between separate calls; subsequent calls, | 
|  | signified by | 
|  | .I s1 | 
|  | being | 
|  | .LR 0 , | 
|  | will work through the string | 
|  | .I s1 | 
|  | immediately following that token. | 
|  | The separator string | 
|  | .I s2 | 
|  | may be different from call to call. | 
|  | When no token remains in | 
|  | .IR s1 , | 
|  | .L 0 | 
|  | is returned. | 
|  | .PP | 
|  | .I Strdup | 
|  | returns a pointer to a distinct copy of the null-terminated string | 
|  | .I s | 
|  | in space obtained from | 
|  | .IR malloc (3) | 
|  | or | 
|  | .L 0 | 
|  | if no space can be obtained. | 
|  | .PP | 
|  | .I Strstr | 
|  | returns a pointer to the first occurrence of | 
|  | .I s2 | 
|  | as a substring of | 
|  | .IR s1 , | 
|  | or 0 if there is none. | 
|  | If | 
|  | .I s2 | 
|  | is the null string, | 
|  | .I strstr | 
|  | returns | 
|  | .IR s1 . | 
|  | .I Cistrstr | 
|  | operates analogously, but ignores ASCII case differences when comparing strings. | 
|  | .SH SOURCE | 
|  | .B \*9/src/lib9 | 
|  | .SH SEE ALSO | 
|  | .IR memory (3), | 
|  | .IR rune (3), | 
|  | .IR runestrcat (3) | 
|  | .SH BUGS | 
|  | These routines know nothing about | 
|  | .SM UTF. | 
|  | Use the routines in | 
|  | .IR rune (3) | 
|  | as appropriate. | 
|  | Note, however, that the definition of | 
|  | .SM UTF | 
|  | guarantees that | 
|  | .I strcmp | 
|  | compares | 
|  | .SM UTF | 
|  | strings correctly. | 
|  | .PP | 
|  | The outcome of overlapping moves varies among implementations. |