字符串长度

size_t strlen(char const *string);

size_t在stddef.h中定义,为unsigned int

复制,连接,比较

char *strcpy(char *dst, char const *src);
char *strncpy(char *dst, char const *src, size_t len);

char *strcat(char *dst, char const *src);
char *strncat(char *dst, char const *src, size_t len);

// s1<s2:-; s1>s2:+; s1=s2:0
int strcmp(char const *s1, char const *s2);
int strncmp(char const *s1, char const *s2, size_t len);

strcpysrc字符串复制到dst参数

数据从右向左流动,与赋值语句的流向相同;总是返回结果串

字符串查找

查找一个字符

char *strchr(char const *str, int ch);
char *strrchr(char const *str, int ch);

return: chstr中第一次出现位置的指针(strrchr反向查找,即返回ch最后出现的位置的指针),不存在返回NULL指针。

查找任何几个字符

char *strpbrk(char const *str, char const *group);

return: 指向str中第一个匹配group中任何一个字符的字符的位置,未找到则返回NULL指针。

查找一个子串

char *strstr(char const *s1, char const *s2);

return: 指向s2第一次在s1中出现的起始位置的指针; 如果没有找到,返回NULL指针; 如果s2是空字符串,返回s1

查找一个字符串前缀

size_t strspn(char const *str, char const *group);
size_t strcspn(char const *str, char const *group);

group指定一个或多个字符,strspn返回str起始部分与group中任意字符匹配的字符数,如计算一个指向字符串的第一个非空字符的指针:

ptr = buffer + strspn(buffer, "\n\r\f\t\v");

strcspnstrspn相反,它对str字符串起始部分中不与group中任何字符匹配的字符进行计数。

查找标记(token)

char *strtok(char *str, char const *sep);

sep参数是一个字符串,定义了用作分隔符的字符集合。str参数指定了一个字符串,它包含零个或多个由sep字符串中一个或多个分隔符分割的标记。strtok找到str中的下一个标记,并将其用NUL结尾,然后返回一个指向当前位置的指针(strtok会改变它处理的字符串)。

如果strtok函数的第一个参数不是NULL,函数将找到第一个标记,strtok同时将保存它在字符串中的位置(为下次调用保存),并返回str起始位置的指针; 如果strtok的第一个参数是NULL,函数就在同一个字符串中从被保存的位置开始向下查找;如果字符串中不存在更多的标记,strtok就返回一个NULL指针。

/*
** 从一个字符数组中提取空白字符分隔的标记并把它们打印出来(每行一个)
*/
#include <stdio.h>
#include <string.h>

void print_tokens(char *line){
    static char whitespace[] = " \t\f\r\v\n";
    char *token;

    token = strtok(line, whitespace);
    while(token != NULL){
        printf("Next token is %s\n", token);
        token = strtok(NULL, whitespace);
    }
}

由于strtok函数保存它处理函数的局部状态信息,所以不能用它同时解析两个字符串

内存操作

处理任意字节序列:

void *memset(void *dest, int ch, size_t length);
void *memcpy(void *dest, void const *src, size_t length);
void *memmove(void *dest, void const *src, size_t length);
void *memcmp(void const *ptr1, void const *ptr2, size_t length);
void *memchr(void const *dest, int ch, size_t length);

memset把从a开始的length个字节都设置为字符值chmemcpy将从src的length个字节的内容复制到dest,但当源字符串与目标字符串重叠时,memcpy的操作结果却不可知,这时应该使用memmovememcmp比较两个任意的字符串,与strcmp相同。