C和指针-5


字符串函数

复制字符串

char *strcpy(char *dst, char const *src);

strcpy无法判断目标字符数组的长度,必须保证有足够的空间容纳需要复制的字符。

连接字符串

char *strcat(char *dst, char const *src);

函数的返回值

上面两个函数将返回第一个参数的拷贝,就是一个指向目标字符数组的指针,通常返回值会被忽略。

字符串比较

int strcmp(char const *s1, char const *s2);

如果s1小于s2,函数将返回一个小于0的值,反之将返回一个大于0的值。

长度受限的字符串函数

char *strncpy(char *dst, char const *src, size_t len);
char *strncat(char *dst, char const *src, size_t len);
int strncmp(char const *s1, char const *s2, size_t len);

注意:如果strlen(src)的值大于或等于len,那么只有len个字符复制到dsr,它的结果将不会以NUL结尾!

查找字符

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

注意第二个参数是整型值,但是它包含了一个字符值,strchr 在字符串 str 中查找字符 ch 第一次出现的位置,找到后函数返回一个指向该位置的指针,如果不存在,函数就返回一个 NULL 指针。 strrchr 与 strchr 基本一致,它返回的是一个指向字符串中该字符最后一次出现的位置。

查找任何几个字符

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

这个函数返回一个指向 str 中第一个匹配 group 中任何一个字符的字符位置,如果未找到,则返回 NULL 指针。

查找一个字串

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

这个函数返回一个指向 s1 中第一个匹配子串 s2 的字符位置,如果未找到,则返回 NULL 指针。

标准库中并不存在 strrstr 或 strrpbrk 函数。

strrstr 实现

#include <string.h>

char *my_strstr(char const *s1, char const *s2)
{
    register char *last;
    register char *current;

    last = NULL;
    if( *s2 != '\0')
    {
        current = strstr(s1, s2);
        while( current != NULL)
        {
            last = current;
            current = strstr(last + 1, s2);
        }
    }
    return last;
}

查找一个字符串前缀

strspnstrcspn用于在字符串的起始位置对字符计数

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

group 字符串指定一个或多个字符,strspn 返回 str 起始部分匹配 group 中任意字符的字符数。strcpsn 相反,返回 str 起始部分中不与 group 中任何字符匹配的字符数,比如使用\n\r\f\t\v作为参数,则返回非空字符的计数。

查找标记

strtok从字符串中隔离各个单独的称为标记(token)的部分,并丢弃分隔符,

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

sep 参数是个字符串,定义了用作分隔符的的字符集合,第一个参数指定一个字符串,它包含零个或多个由 sep 字符串中一个或多个分隔符分隔的标记。 strtok 找到 str 的下一个标记,并将其用 NUL 结尾,然后返回一个指向这个标记的指针。

#include <string.h>
#include <stdio.h>

int main () 
{
   char str[80] = "This is - an - test";
   const char s[2] = "-";
   char *token;

   /* 获取第一个子字符串 */
   token = strtok(str, s);

   /* 继续获取其他的子字符串 */
   while( token != NULL ) {
      printf( "%s\n", token );

      token = strtok(NULL, s);
   }

   return(0);
}

结果

This is 
an
website

警告:使用 strtok 函数会修改它所处理的字符串!
警告:由于 strtok 函数保存它所处理的函数的局部状态信息(静态变量),所以不能用它同时解析两个字符串!

内存操作

由于字符串操作在遇到 NUL 时会停止,使用另外一组函数可以处理任意的字节序列。

void *memcpy(void *dst, void const *src, size_t length);
void *memmove(void *dst, void const *src, size_t length);
void *memcmp(void const *a, void const *b, size_t lenth);
void *memchr(void const *a, int ch, size_t length);
void *memset(void *a, int ch, size_t length);
  • 分享:
评论
还没有评论
    发表评论 说点什么