• 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 ",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 %s ", a, b);
    11.    memcpy(b, a, strlen(a));
    12.    printf("%s %s ", 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 ", 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 ", c, ptr - str);
    9.    else
    10.       printf("The character was not found ");
    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 ");
    8.    else
    9.       printf("buffer2 is less than buffer1 ");
    10.    ptr=strcmp(buf2,buf3);
    11.    if(ptr>0)
    12.       printf("buffer2 is greater than buffer3 ");
    13.    else
    14.    printf("buffer2 is less than buffer3 ");
    15.    return 0;
    16. }

    程序执行结果是:

    buffer2 is greater than buffer1

    buffer2 is less than buffer3

    • strlen

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

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

    程序示例:

    1. int main()
    2. {
    3.    char *he= "Hello,world";
    4.    printf("字符串长度为%d ",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 ",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 ");
    10.    else
    11.       printf("buffer2 is less than buffer1 ");
    12.  
    13.    ptr=strncmp(buf2,buf3,3);
    14.  
    15.    if(ptr>0)
    16.       printf("buffer2 isgreater than buffer3 ");
    17.    else
    18.       printf("buffer2 is less than buffer3 ");
    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 ",*ptr);
    9.    else
    10.       printf("strpbrk didn't find character in set ");
    11.    return 0;
    12. }

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

    • strrchr

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

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

    • strrev

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

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

    程序示例:

    1. int main(void)
    2. {
    3.    char* forward= {"string"};
    4.    printf("Before strrev(): %s ", forward);
    5.    char* reverse = strrev(strdup(forward));
    6.    printf("After strrev(): %s ", 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 ",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 ",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 ",p);
    20.    return 0;
    21. }

    程序输出结果:

    abc

    def

    • swab

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

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

    程序示例:

    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 ",target1);
    9.    swab(source2, target2, strlen(source2));
    10.    printf("This is target:%s ",target2);
    11.    return 0;
    12. }

    程序输入结果:

    This is target:FranoklBnrda

    This is target:FranoklBnr

  • 相关阅读:
    [Swift]LeetCode632. 最小区间 | Smallest Range
    [Swift]有用的Binary Heap Type类
    [Swift]LeetCode633. 平方数之和 | Sum of Square Numbers
    [Swift]LeetCode630. 课程表 III | Course Schedule III
    [Swift]LeetCode629. K个逆序对数组 | K Inverse Pairs Array
    [Swift]LeetCode628. 三个数的最大乘积 | Maximum Product of Three Numbers
    [SQL]LeetCode627. 交换工资 | Swap Salary
    [SQL]LeetCode626. 换座位 | Exchange Seats
    [Swift]LeetCode623. 在二叉树中增加一行 | Add One Row to Tree
    [Swift]LeetCode622. 设计循环队列 | Design Circular Queue
  • 原文地址:https://www.cnblogs.com/superpig0501/p/3999789.html
Copyright © 2020-2023  润新知