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

2014年9月29日

  • strcpy

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

用法:#include

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

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

返回指向dest的指针。

  1. #include<stdio.h>
  2. #include<string.h>
  3. int main(void){
  4.    charstring[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);

头文件:<memory.h>

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

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

memcpy会存在一个问题,就是如果出现dest是否与src重合,那么就内存的后半段就会被前半段复制过来的内容覆盖。事实上,编译器会对这种情况进行检测,并报错。而某些编译器,比如"gcc和VS会对这种情况直接调用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所指内存区域。

相关函数:memset、memcpy

  • memset

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

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

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

  • strncpy

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

功能:将字符串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

时间: 2024-08-09 03:48:16

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

不要在头文件中写函数定义

我们都知道static声明静态函数在别的文件是不可以使用的,但是如果你将定义也写在.h文件下是不是还是这样的呢,或者说编译器会不会提示你这样是有问题的呢?结果却是将static函数的定义直接写在了file.h的头文件中,导致staic关键字失效,代码如下. //file1.h #include <iostream>using namespace std; static void fun() { cout << "static fun" << ends

C++编程常用头文件及其包含函数汇总

1. #include<iostream>是标准的C++头文件,任何符合标准的C++开发环境都有这个头文件. 当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现:当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std:这样才能正确使用cout.   2.#include <cstdlib>是C++里面的一个常用函数库, 等价于C中的<stdlib.h>

strings.h 与 string.h 头文件的区别

今天使用 man string 来查看 string 文件的使用的方法(毕竟里面的函数名字和传入参数和发挥参数的类型,如果一段时间不使用,会产生遗忘.) 偶然发现,string.h 的man page 中 出现了 strings.h 的说明.这引起的我的好奇,很奇怪这个strings 和 string 之间的关系.我上网搜了几个帖子,他们写的不够清楚,今天我进行重新整理一下吧: 首先我们看一下man string 里面的内容: 可见,strings 头文件中包含了部分函数,没有在 string.

#include&lt;bits/stdc++.h&gt;包含所有C++头文件

#include<bits/stdc++.h>包含所有C++头文件,比如以下 #include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <st

C语言头文件中包含的函数

math.h常用函数 int  abs   (int x); double  acos  (double x); double  asin  (double x); double  atan  (double x); double  atan2 (double y, double x); double  atof  (const char *s); double  ceil  (double x); double  cos   (double x); double  cosh  (double

c语言头文件中定义全局变量的问题

问题是这么开始的: 最近在看一个PHP的扩展源码,编译的时候的遇到一个问题: ld: 1 duplicate symbol for architecture x86_64 仔细看了一下源码,发现在头文件中 出现了全局变量的定义. 简化一下后,可以这么理解: // t1.h #ifndef T1_H #define T1_H int a = 0; #endif //------------------ //t1.c #include "t1.h" #include "t2.h&

c语言头文件中定义变量

最近在看一个PHP的扩展源码,编译的时候的遇到一个问题: ld: 1 duplicate symbol for architecture x86_64 仔细看了一下源码,发现在头文件中 出现了全局变量的定义 ZEND_DECLARE_MODULE_GLOBALS(xx) 简单开来,可以这么理解 // t1.h #ifndef T1_H #define T1_H int a = 0; #endif //------------------ //t1.c #include "t1.h" #

C语言之在头文件中定义全局变量

通常情况下,都是在C文件中定义全局变量,在头文件中声明,但是,如果我们定义的全局变量需要被很多的C文件使用的话,那么将全局变量定义在头文件里面会方便很多,那到底是如何实现的? os_var.c文件内容 1 #define OS_GLOBALS 2 #include “os.h” os.h文件内容 1 #ifdef OS_GLOBALS 2 #define OS_EXT 3 #else 4 #define OS_EXT extern 5 #endif os.h中定义很多的全局变量,但是os.h又需

C语言头文件中定义全局变量导致重复定义错误

合作方升级SDK后,程序编译出现变量重复定义的错误,通过错误提示无法找到什么位置重复定义了,但确定是引入新SDK后才出现的错误,从SDK的头文件中查找,最终发现在头文件中定义了全局变量 我们的项目在多个头文件中include了SDK的头文件,所以相当于这个全局变量在多个头文件中定义了,因此报错. 总结:头文件不要有任何全局变量的定义出现