`

string.h(一)memset, memcpy, strcpy/strncpy, strcat/strncat, strlen, ...

 
阅读更多
文章结构:
一、string.h中声明的重要函数
二、memset()详解
三、strcpy()和strncpy()详解
*************************************************************************************************************************************
一、string.h中声明的重要函数
/usr/include/string.h中声明了(在哪里实现呢?)
    (1) 对内存的按byte操作
    (2) 对char*进行处理的操作
 
__BEGIN_NAMESPACE_STD
内存相关(按byte来处理)
/* Copy N bytes of SRC to DEST. */
extern void *memcpy (void *__restrict __dest, __const void *__restrict __src, size_t __n)
__THROW __nonnull ((1,2));
 
/* Copy N bytes of SRC to DEST, guaranteeing correct behavior for overlapping strings. */
extern void *memmove (void *__dest, __const void *__src, size_t __n)
        __THROW __nonnull ((1,2));
 
/* Set N bytes of S to C. */
extern void *memset (void *__s, int __c, size_t __n) __THROW __nonnull ((1));
 
字符串相关(注意:是对char *的处理,而非string类)
/* Copy SRC to DEST. */
extern char *strcpy (char *__restrict __dest, __const char *__restrict __src)
        __THROW __nonnull ((1,2));
 
/* Copy no more than N characters of SRC to DEST. */
extern char *strncpy (char *__restrict __dest, __const char *__restrict __src, size_t __n)
        __THROW __nonnull ((1,2));
 
/* Append SRC onto DEST. */
extern char *strcat (char *__restrict __dest, __const char *__restrict __src)
        __THROW __nonnull ((1,2));
 
/* Append no more than N characters from SRC onto DEST. */
extern char *strncat (char *__restrict __dest, __const char *__restrict __src, size_t __n)
        __THROW __nonnull ((1,2));
 
/* Compare S1 and S2. */
extern int strcmp (__const char *__s1, __const char *__s2)
        __THROW __attribute_pure__ __nonnull ((1,2));
/* Compare N characters of S1 and S2. */
extern int strncmp (__const char *__s1, __const char *__s2, size_t __n)
        __THROW __attribute_pure__ __nonnull ((1,2));
 
/* Return the length of S. */
extern size_t strlen (__const char *__s)
        __THROW __attribute_pure__ __nonnull ((1));
 
__END_NAMESPACE_STD
 
***********************************************************************************************
memset()详解:
1. void *memset(void *s,int c,size_t n)
总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。

2. 例子
#include<iostream>
using namespace std;

int main(void){
    char s[]="Golden Global View";
    //若写成char *s="Golden Global View",报错"Access violation writing location 0x00e7580c."
    //这是因为*s指针指向的字符串常量在内存空间的常量区,它不能修改;若定义为s[]则会在栈上分配
    //空间,可以修改。

    memset(s,'G',6);
    printf("%s",s);
   
    system("pause");
    return 0;
}

 


3. memset() 函数常用于内存空间初始化。如:
char str[100];
memset(str,0,100);

4. memset()的深刻内涵:用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;例:char a[100];memset(a, '/0', sizeof(a));

memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度。
例:char a[100],b[50]; memcpy(b, a, sizeof(b));拷贝a数组中长度为sizeof(b)的字节  到  b数组
注意如用sizeof(a),会造成b的内存地址溢出。

strcpy就只能拷贝字符串了,它遇到'/0'就结束拷贝。
例:char a[100],b[50]; strcpy(a,b);
如用strcpy(b,a),要注意a中的字符串长度(第一个‘/0’之前)是否超过50位,如超过,则会造成b的内存地址溢出。

5.补充:一点心得
memset可以方便的清空一个结构类型的变量或数组。如:

struct sample_struct {
char csName[16];
int iSeq;
int iType;
};

对于变量 struct sample_strcut stTest; 一般情况下,清空stTest的方法:
stTest.csName[0]='/0';
stTest.iSeq=0;
stTest.iType=0;

用memset就非常方便:
memset(&stTest,0,sizeof(struct sample_struct));

如果是数组 struct sample_struct TEST[10]; 则
memset(TEST,0,sizeof(struct sample_struct)*10);

参考资料<memset函数详细说明>: http://blog.csdn.net/yangsen2016/article/details/1638503

 

6. 对于int数组(一维或者二维 ,memset()只能赋予某些 ,不是全部值!

Sam已经证明可以对二维数组进行memset,千真万确没有一点问题!

#include<iostream>
using namespace std;

int main(void){
	//C++中用memset,
	//1. 可以赋予int数组0,-1;可以赋bool数组为true,false;可以赋予char数组任何单个字符。其他不好说
        // 因为int型的0二进制为:00...0  ; int型的1二进制为:11...1
        //2. sizeof()对于一维、二维数组都好使!

	int map[5][5];
	memset(map,-1,sizeof(map));

	printf("%d\n",sizeof(map));

	for(int i=0;i<5;i++){
		for(int j=0;j<5;j++){
			printf("%d\t",map[i][j]);
		}
		printf("\n");
	}

	int arr[10];
	printf("%d\n",sizeof(arr));
	memset(arr,0,sizeof(arr));
	for(int i=0;i<10;i++)
		printf("%d\t",arr[i]);
	printf("\n");

	/////////////////////////////////////////////////////////////////////////////////////////////
	char map2[5][5];
	memset(map2,'%',sizeof(map2));

	printf("%d\n",sizeof(map2));

	for(int i=0;i<5;i++){
		for(int j=0;j<5;j++){
			printf("%c\t",map2[i][j]);
		}
		printf("\n");
	}

	system("pause");
	return 0;
}
***********************************************************************************************
strcpy()和strncpy()详解:
转自:http://www.cnblogs.com/xmxu/archive/2012/08/20/2647382.html

 

1. strcpy函数:顾名思义字符串复制函数:原型:extern char *strcpy(char *dest,char *src); 功能:把从src地址开始且含有NULL结束符的字符串赋值到以dest开始的地址空间,返回dest(地址中存储的为复制后的新值)。要求:src和 dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
  一般函数原型实现方式:
  char * strcpy(char * strDest,const char * strSrc)
  {
  char * strDestCopy=strDest; //[3]
  if ((strDest==NULL)||(strSrc==NULL)) //[1]
  throw "Invalid argument(s)"; //[2]
  while ((*strDest++=*strSrc++)!='\0'); //[4]
  return strDestCopy;
  }
   该函数的参数是字符指针,也就是可以是字符串变量和字符数组,因为它们的变量名代表首字符地址。字符串默认有一个null结束符,字符数组没有。所以此 处需要注意:因为src要求有null结束符,所以字符数组的长度必须大于等于src包含null结束符的总长度。例如,char* src="abcd"; char dest[5]; 这里dest的长度就至少为5。
2. strncpy函数:多个n代表可以指定字符个数进行赋值。原型:char * strncpy(char *dest, char *src, size_tn);  功能:将字符串src中最多n个字符复制到字符数组dest中(它并不像strcpy一样遇到NULL才停止复制,而是等凑够n个字符才开始复制),返回 指向dest的指针。要求:如果n > dest串长度,dest栈空间溢出产生崩溃异常。该函数注意的地方和strcpy类似,但是n值需特别注意,
  1)src串长度<=dest串长度,(这里的串长度包含串尾NULL字符)
   如果n=(0, src串长度),src的前n个字符复制到dest中。但是由于没有NULL字符,所以直接访问dest串会发生栈溢出的异常情况。这时,一般建议采取 memset将dest的全部元素用null填充,如:memset(dest,0,7)(7为从dest起始地址开始前7个位置填充null,dest 可以为字符指针和数组名)。注意:char* pc="abc"; char chs[5]; sizeof(pc)为4(包含null)(有些编译器不行),sizeof(chs)为5。
  如果n = src串长度,与strcpy一致。
  如果n = dest串长度,[0,src串长度]处存放于desk字串,(src串长度, dest串长度]处存放NULL。
  2)src串长度>dest串长度
  如果n =dest串长度,则dest串没有NULL字符,会导致输出会有乱码。如果不考虑src串复制完整性,可以将dest最后一字符置为NULL。
  所以,一般把n设为dest(含null)的长度(除非将多个src复制到dest中)。当2)中n=dest串长度时,定义dest为字符数组,因为这时没有null字符拷贝。

 
 
分享到:
评论

相关推荐

    C标准库函数.CHM

    2.14 string.h 2.14.1 Variables and Definitions 2.14.2 memchr 2.14.3 memcmp 2.14.4 memcpy 2.14.5 memmove 2.14.6 memset 2.14.7 strcat 2.14.8 strncat 2.14.9 strchr 2.14.10 strcmp 2.14.11 ...

    C语言字符串各函数-具体实现

    strcpy,strncpy,strcat,strncat,strcmp,strncmp,strchr,strnchr,strlen,strnlen,strspn,strpbrk,strtok,strsep,memset,bcopy,memcpy,memmove,memcmp,memscan,strstr,memchr.函数具体实现内容。对理解C语言和C编程有...

    C语言函数库函数详细介绍手册

    memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup stricmp strlen strlwr strncat strncmp strncmpi strncpy strnicmp strpbrk ...

    C语言函数速查

    memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup stricmp strlen strlwr strncat strncmp strncmpi strncpy strnicmp strpbrk ...

    C 语言库函数使用手册

    memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup stricmp strlen strlwr strncat strncmp strncmpi strncpy strnicmp strpbrk ...

    C语言库函数速查 CHM

    memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup stricmp strlen strlwr strncat strncmp strncmpi strncpy strnicmp strpbrk ...

    C语言函数速查手册

    memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup stricmp strlen strlwr strncat strncmp strncmpi strncpy strnicmp strpbrk ...

    常见面试需要实现的函数std_func.c

    * 常见的字符串函数实现: * strlen * strcpy strncpy * strcmp strncmp * strcat strncat * strstr * * 内存操作: * memset、memcmp、memcpy、memmove * * 字符串和数组转换: * atoi itoa *

    -C++参考大全(第四版) (2010 年度畅销榜

    26.27 strncpy函数 26.28 strpbrk函数 26.29 strrchr函数 26.30 strspn函数 26.31 strstr函数 26.32 strtok函数 26.33 strxfrm函数 26.34 tolower函数 26.35 toupper函数 第27章 数学函数 27.1 acos函数 27.2 asin...

    c/c++函数库说明(api)html版

    strncat (stdstring) strncmp (stdstring) strncpy (stdstring) strpbrk (stdstring) strrchr (stdstring) strspn (stdstring) strstr (stdstring) strtod (stdstring) strtok (stdstring) strtol (std...

    C语言讲义.doc

    1.1.22 memset,memcpy,memmove函数 61 1.1.23 指针小结 63 2 字符指针与字符串 64 2.1 指针和字符串 64 2.2 通过指针访问字符串数组 64 2.3 函数的参数为CHAR * 64 2.4 指针数组做为MAIN函数的形参 65 3 内存管理 65...

    linux_c API函数大全

    memset(将一段内存空间填入某值) 40 5.11 40 rindex(查找字符串中最后一个出现的指定字符) 40 5.12 41 strcasecmp(忽略大小写比较字符串) 41 5.13 41 strcat(连接两字符串) 41 5.14 42 strchr(查找字符串中...

Global site tag (gtag.js) - Google Analytics