C语言<memory.h>和<string.h>头文件中的函数

C语言<memory.h><string.h>头文件中的函数

2014929

 

本文中的字符串,都是C风格(C-style)的字符串,即由char*指针指向的字符数组,所以请忽略代码部分中高亮的"string"关键字,它不是C++中的关键字。

 

  • strcpy

原型:extern char *strcpy(char * dest, char * src);

功能:把src所指由NULL结束的字符串复制到dest所指的数组中。

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

返回指向dest的指针。

  1. #include<stdio.h>
  2. #include<string.h>
  3. int main(void){
  4.    char string[10];
  5.    char*str1="abcdefghi";
  6.    strcpy(string,str1);
  7.    printf("%s\n",string);
  8.    return0;
  9. }

 

  • memcpy

原型:extern void *memcpy(void *dest, void *src, unsigned int count);

功能:由src所指内存区域复制count个字节到dest所指内存区域。

说明:srcdest所指内存区域不能重叠,函数返回指向dest的指针。

memcpy会存在一个问题,就是如果出现dest是否与src重合,那么就内存的后半段就会被前半段复制过来的内容覆盖。事实上,编译器会对这种情况进行检测,并报错。而某些编译器,比如"gccVS会对这种情况直接调用memmove函数"(来源:http://bbs.csdn.net/topics/380234075)。举例如下:

  1. #include <memory.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. int main(){
  7.    char *a = "abcdef";
  8. // char *b = (char*)malloc(strlen(a));
  9.    char *b = a + 2;
  10.    printf("%s\n%s\n", a, b);
  11.    memcpy(b, a, strlen(a));
  12.    printf("%s\n%s\n", a, b);
  13. // free(b);
  14.    return 0;
  15. }

VC++下运行会产生运行时错误并崩溃。

 

  • memmove

原型:void *memmove( void* dest, const void* src, size_t count );

功能:由src所指内存区域复制count个字节到dest所指内存区域。

相关函数:memsetmemcpy

 

  • memset

原型:extern void *memset(void *buffer, int c, int count);

功能:把buffer所指内存区域的前count个字节设置成字符c

说明:返回指向buffer的指针。

 

  • strncpy

原型:char *strncpy(char *dest, char *src, size_t n);

功能:将字符串src中最多n个字符复制到字符数组dest(它并不像strcpy一样遇到NULL才停止复制,而是等凑够n个字符才开始复制),返回指向dest的指针。

 

  • strcat

原型: char *strcat(char *destin, char *source);

功能: 字符串拼接函数

示例:

  1. #include <memory.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. int main()
  7. {
  8.    char destination[25];
  9.    char*blank=" ",*c="C++",*Borland="Borland";
  10.    strcpy(destination, Borland);
  11.    strcat(destination, blank);
  12.    strcat(destination, c);
  13.    printf("%s\n", destination);
  14.    return 0;
  15. }

程序最终输出"Borland C++"

 

  • strchr

原型: char *strchr(char *str, char c);

功能: 在一个串中查找给定字符的第一个匹配处的指针

程序例:

  1. int main(void)
  2. {
  3.    char str [15];
  4.    char *ptr,c = 'r';
  5.    strcpy(str,"This is a string");
  6.    ptr = strchr(str,c);
  7.    if(ptr)
  8.       printf("The character %c is at position: %d\n", c, ptr - str);
  9.    else
  10.       printf("The character was not found\n");
  11.    return 0;
  12. }

程序运行结果为"The character r is at position: 12"

 

  • strcmp

原型: int strcmp(char *str1, char *str2);

功能: 串比较

ASCII码,str1>str2,返回值 > 0;两串相等,返回0

程序例:

  1. int main(void)
  2. {
  3.    char*buf1="aba",*buf2="abb",*buf3="abc";
  4.    int ptr;
  5.    ptr=strcmp(buf2,buf1);
  6.    if(ptr>0)
  7.       printf("buffer2 is greater than buffer1\n");
  8.    else
  9.       printf("buffer2 is less than buffer1\n");
  10.    ptr=strcmp(buf2,buf3);
  11.    if(ptr>0)
  12.       printf("buffer2 is greater than buffer3\n");
  13.    else
  14.    printf("buffer2 is less than buffer3\n");
  15.    return 0;
  16. }

程序执行结果是:

buffer2 is greater than buffer1

buffer2 is less than buffer3

 

  • strlen

原型: size_t strlen(const char *s);

功能: strlen函数求的是字符串的长度,它求得方法是从字符串的首地址开始到遇到第一个'\0'停止计数,如果你只定义没有给它赋初值,这个结果是不定的,它会从字符串首地址一直记下去,直到遇到'\0'才会停止。

程序示例:

  1. int main()
  2. {
  3.    char *he= "Hello,world";
  4.    printf("字符串长度为%d\n",strlen(he));
  5.    return 0;
  6. }

运行结果:

字符串长度为11

 

  • strdup

原型:char *strdup(char *str);

功能:将串拷贝到新建的位置处

程序示例:

  1. int main(void)
  2. {
  3.    char*dup_str,*string="abcde";
  4.    dup_str=strdup(string);
  5.    printf("%s\n",dup_str);
  6.    free(dup_str);
  7.    return 0;
  8. }

程序运行结果为:"abcde"

 

  • strncmp

原型: int strncmp(char *str1, char *str2, int maxlen);

功能: 比较由前maxlen个字符构成的子串的大小。

程序例:

  1. int main(void)
  2. {
  3.    char*buf1="aaabbb",*buf2="bbbccc",*buf3="ccc";
  4.    int ptr;
  5.  
  6.    ptr=strncmp(buf2,buf1,3);
  7.  
  8.    if(ptr>0)
  9.       printf("buffer2 is greater than buffer1\n");
  10.    else
  11.       printf("buffer2 is less than buffer1\n");
  12.  
  13.    ptr=strncmp(buf2,buf3,3);
  14.  
  15.    if(ptr>0)
  16.       printf("buffer2 isgreater than buffer3\n");
  17.    else
  18.       printf("buffer2 is less than buffer3\n");
  19.    return 0;
  20. }

程序执行结果是:

buffer2 is greater than buffer1

buffer2 is less than buffer3

 

 

  • strpbrk

原型: char *strpbrk(char *origin, char *charset);

功能: 在串中查找给定字符集中的字符,返回出现的第一个字符

程序例:

  1. int main(void)
  2. {
  3.    char* string1="abcdefghijklmnopqrstuvwxyz";
  4.    char* string2="onm";
  5.    char* ptr;
  6.    ptr=strpbrk(string1, string2);
  7.    if(ptr)
  8.       printf("strpbrk found first character: %c\n",*ptr);
  9.    else
  10.       printf("strpbrk didn't find character in set\n");
  11.    return 0;
  12. }

程序运行结果为"strpbrk found first character: m"

 

  • strrchr

原型: char *strrchr(char *str, char c);

功能: 在串中查找指定字符的最后一次出现

 

  • strrev

原型: char *strrev(char *str);

功能: 串倒转,以'\0'为结束

程序示例:

  1. int main(void)
  2. {
  3.    char* forward= {"string"};
  4.    printf("Before strrev(): %s\n", forward);
  5.    char* reverse = strrev(strdup(forward));
  6.    printf("After strrev(): %s\n", reverse);
  7.    return 0;
  8. }

注意,一定要使用strdup函数才能进行反转。

程序运行结果:

Before strrev(): string

After strrev(): gnirts

 

  • strstr

原型: char *strstr(char *str1, char *str2);

功能: 在串中查找指定字符串的第一次出现,返回指向第一次出现位置的指针。如果没找到则返回NULL

程序示例:

  1. int main(void)
  2. {
  3.    char*str1="BorlandInternational", *str2="nation", *ptr;
  4.    ptr = strstr(str1,str2);
  5.    printf("Thesubstringis:%s\n",ptr);
  6.    return 0;
  7. }

输出为:The sub string is: national

 

 

  • strtok

原型: char *strtok(char *str1, char *str2);

功能: 查找由在第二个串中指定的分界符分隔开的单词

程序示例:

  1. int main(void)
  2. {
  3.    char input[16]="abc,def";
  4.    char*p;
  5.  
  6.    /*strtok places a NULL terminator
  7.    in front of the token,if found*/
  8.  
  9.    p=strtok(input,",");
  10.    if(p)
  11.       printf("%s\n",p);
  12.  
  13.    /*A second call to strtok using a NULL
  14.    as the first parameter returns a pointer
  15.    to the character following the token*/
  16.  
  17.    p=strtok(NULL,",");
  18.    if(p)
  19.       printf("%s\n",p);
  20.    return 0;
  21. }

程序输出结果:

abc

def

 

  • swab

原型: void swab (char *from, char *to, int nbytes);

功能: 交换字符串内相邻的两个字节,如果是偶数个字符,长度不变;如果是奇数个字符,则长度要减小1,因为最后一个字符和字符串结束标志'\0'做了交换。

程序示例:

  1. char source1[15]="rFnakoBlrnad";
  2. char source2[15]="rFnakoBlrna";
  3. char target1[15] ,target2[15];
  4.  
  5. int main(void)
  6. {
  7.    swab(source1, target1, strlen(source1));
  8.    printf("This is target:%s\n",target1);
  9.    swab(source2, target2, strlen(source2));
  10.    printf("This is target:%s\n",target2);
  11.    return 0;
  12. }

程序输入结果:

This is target:FranoklBnrda

This is target:FranoklBnr

posted @ 2014-09-29 11:10  Superpig0501  阅读(2475)  评论(0编辑  收藏  举报