[C语言]字符串函数大全

字符串拷贝


memcpy()

  • 原型
void *memcpy(char *dest, const char *source, size_t n);
  • 功能
    把从source所指向内存地址的起始位置开始拷贝n个字节到dest所指内存地址的起始位置中.
    source指向的对象中复制n个字符到s1指向的对象中

  • 说明

    • sourcedest所指内存区域可以重叠, 但是如果重叠, memcpy不保证source所在重叠区域在拷贝之前不被覆盖.

    • sourcedest都不一定是数组,任意的可读写的空间均可

  • 示例

int main(void)
{
    char src[]="******************************";
    char dest[]="abcdefghijlkmnopqrstuvwxyz0123as6";
    printf("destination before memcpy:%s\n",dest);
    memcpy(dest,src,strlen(src));
    printf("destination after memcpy:%s\n",dest);
    return 0;
}

memmove()

  • 原型
void *memmove(char *dest, const char *source, size_t n);
  • 功能
    把从source所指向内存地址的起始位置开始拷贝n个字节到dest所指内存地址的起始位置中.

  • 说明
    没有memcpy的缺点

  • 示例

int main(void)
{
    char src[]="******************************";
    char dest[]="abcdefghijlkmnopqrstuvwxyz0123as6";
    printf("destination before memcpy:%s\n",dest);
    memcpy(dest,src,strlen(src));
    printf("destination after memcpy:%s\n",dest);
    return 0;
}

strcpy()

  • 原型
char *strcpy(char *dest, const char *source);
  • 功能
    把从source地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间

  • 说明
    sourcedest所指内存区域不可以重叠且dest必须有足够的空间来容纳source的字符串。

  • 示例

int main(void)
{
   char string[10];

   strcpy(string, "zhangrong");
   printf("%s\n", string);
   strcpy(string, "wang");
   printf("%s\n", string);
   return 0;
}

strncpy()

  • 原型
char *strncpy(char *dest, const char *source, size_t n);
  • 功能
    复制字符串src中的内容(字符,数字、汉字....)到字符串dest中,复制多少由size_t n的值决定。
    如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。
    如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。

  • 说明
    srcdest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符长度+'\0'

  • 示例

int main(void)
{
   char string[10];
   char *str1 = "abcdefghi";

   strncpy(string, str1, 3);
   string[3] = '\0';
   printf("%s\n", string);
   return 0;
}

字符串拼接


strcat()

  • 原型
char *strcat(char *dest, const char *source);
  • 功能
    src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'

  • 说明
    sourcedest所指内存区域不可以重叠且dest必须有足够的空间来容纳source的字符串。

  • 示例

int main(void)
{
   char destination[25];
   char *blank = " ", *c = "C++", *Borland = "Borland";

   strcpy(destination, Borland);
   strcat(destination, blank);
   strcat(destination, c);
   printf("%s\n", destination);
   return 0;
}

strncat()

  • 原型
char *strncat(char *dest, const char *source, size_t n);
  • 功能
    src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'

  • 说明
    sourcedest所指内存区域不可以重叠且dest必须有足够的空间来容纳source的字符串。

  • 示例

int main()
{
    char d[20] = "GoldenGlobal";
    char * s = "ViewWinIDELibrary";
    strncat(d,s,4);
    printf("%s\n",d);
    return 0;
}

字符串比较


memcmp()

  • 原型
int memcmp(const void *s1, const void s2, size_t n);
  • 功能
    s1指向对象的前n个字节和s2指向对象的前n个字节进行比较

  • 说明

    • s1 > s2时,返回正数

    • s1 = s2时,返回值 = 0

    • s1 < s2时,返回为负数

  • 示例


strcmp()

  • 原型
int strcmp(const char *s1, const char *s2);
  • 功能
    比较字符串s1s2

  • 说明

    • s1 < s2时,返回为负数

    • s1 = s2时,返回值 = 0

    • s1 > s2时,返回正数

即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止

  • 示例
int main()
{
    printf("%d\n", strcmp("wang", "wang"));
    printf("%d\n", strcmp("wang", "zhang"));
    printf("%d\n", strcmp("zhang", "wang"));
    return 0;
}
  • 源码

strcoll()

strcmp类似


strncmp()

  • 原型
int strncmp(const char *s1, const char *s2, size_t n);
  • 功能
    比较字符串s1s2的前n个字符

  • 说明

    • s1 < s2时,返回为负数

    • s1 = s2时,返回值 = 0

    • s1 > s2时,返回正数

即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止

  • 示例

strxfrm

字符串搜索


memchr()

  • 原型
void *memchr(const void *buf, int ch, size_t count);
  • 功能
    buf所指内存区域的前count个字节查找字符ch

  • 说明
    当第一次遇到字符ch时停止查找。如果成功,返回指向字符ch的指针;否则返回NULL

  • 示例

int main(void)
{
    char buf[] = "abcdefghijlkmnopqrstuvwxyz0123as6";
    printf("%s\n", memchr(buf, 'h', 20));
    return 0;
}
  • 源码
void * memchr(const void *s, int c, size_t n)
{
    const unsigned char uc = c;
    const unsigned char *su;

    for(su = s; 0 < n; ++su, --n)
    {
        if( *su == uc)
            return ( (void *)su );
    }

    return NULL;
}

strchr()

  • 原型
char *strchr(const char *s,char c);
  • 功能
    查找字符串s中首次出现字符c的位置

  • 说明
    返回首次出现c的位置的指针,返回的地址是字符串在内存中随机分配的地址再加上你所搜索的字符在字符串位置,
    如果s中不存在c则返回NULL

  • 示例

int main(void)
{
    char buf[] = "abcdefghijlkmnopqrstuvwxyz0123as6";
    printf("%s\n", strchr(buf, 'h'));
    return 0;
}

strrchr()

  • 原型
char *strrchr(const char *str, char c);
  • 功能
    查找一个字符c在另一个字符串str中末次出现的位置

  • 说明

  • 示例

int main(void)
{
    char *str = "abcdefghijlkabcdefg";
    printf("%s\n", strrchr(str, 'b'));
    printf("%s\n", strchr(str, 'b'));
    return 0;
}

strspn()


strcspn()

  • 原型
size_t strcspn(const char *s1, const char *s2);
  • 功能
    顺序在字符串s1中搜寻与s2第一个相同字符,包括结束符NULL,返回这个字符在s1中第一次出现的位置。

  • 说明
    在字符串s1中搜索字符串s2, 返回s2s1中第一次出现的下标值

  • 示例

int main(void)
{
    char *s1 = "abcdefghijlkmnopqrstuvwxyz0123as6";
    char *s2 = "def";
    printf("%d\n", strcspn(s1, s2));
    return 0;
}

strpbrk()


strstr()

  • 原型
char *strstr(char *s1, const char *s2);
  • 功能
    找出字符串s2在字符串s1中第一次出现的位置

  • 说明
    返回该位置的指针, 如果找不到, 返回NULL

  • 示例

int main(void)
{
    char *s1 = "abcdefghijlkabcdefg";
    char *s2 = "def";
    printf("%s\n", strstr(s1, s2));
    return 0;
}

strtok()

  • 原型
char *strtok(char *s, const char *delim);
  • 功能
    分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。

  • 说明

    • 参数s指向欲分割的字符串, 参数delim则为分割字符串中包含的所有字符
    • strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0字符
    • 在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针。
  • 示例

Miscellaneous


memset()

  • 原型
void *memset(void *s, int ch, size_t n);
  • 功能
    s中前n个字节用ch替换并返回s

  • 说明
    对较大的结构体或数组进行清零操作的一种最快方法

  • 示例

int main(void)
{
    char s1[] = "abcdefghijlkabcdefg";
    memset(s1, 0x00, sizeof(s1)/sizeof(char));
    printf("%s\n", s1);
    return 0;
}

strerror()


strlen()

  • 原型
size_t strlen(const char *s);
  • 功能
    计算字符串s的长度,不包括'\0'在内

  • 说明

  • 示例

int main(void)
{
    char s1[] = "abcdefghijlkabcdefg";
    printf("%d\n", strlen(s1));
    printf("%d\n", sizeof(s1));
    return 0;
}

posted on 2014-12-30 13:21  kdurant  阅读(346)  评论(0编辑  收藏  举报

导航