`

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字符拷贝。

 
 
分享到:
评论

相关推荐

    string.h的函数大全

    在C++编程语言中,`&lt;string.h&gt;`头文件是C标准库的一部分,它提供了处理C风格字符串(字符数组)的一系列函数。虽然在C++中我们通常使用`std::string`类来处理字符串,但了解`&lt;string.h&gt;`中的函数仍然很重要,特别是...

    C_string.h库文件

    在使用"C_string.h"库时,需要注意字符串操作可能导致的缓冲区溢出问题,尤其是在使用`strcpy()`、`strcat()`和`strncat()`时。因此,确保目标字符串有足够的空间容纳源字符串是至关重要的。同时,为了提高代码的...

    字符串函数string.h应用举例.zip

    5. **strcat()** 和 **strncat()**: `strcat()`将一个字符串追加到另一个字符串的末尾,而`strncat()`则限制了追加的字符数。这两个函数都需要确保目标字符串有足够的空间容纳新内容。 6. **strchr()** 和 **strstr...

    单片机C语言实例-字符串函数string.h应用举例.zip

    7. `memset()` 和 `memcpy()` 函数:虽然不是`string.h`库的一部分,但常与字符串处理一起使用。`memset(ptr, val, num)`将`ptr`指向的内存区域的`num`个字节设置为`val`的值,常用于初始化数组或清零内存。`memcpy...

    单片机实例305-字符串函数string.h应用举例.rar

    7. `strncpy()` 和 `strncat()` 函数:这两个函数类似于`strcpy()` 和 `strcat()`,但它们接受一个额外的参数,限制复制的字符数。这对于处理有限内存的单片机至关重要,防止了可能的缓冲区溢出。 8. `memset()` 和...

    C语言38:字符串函数string.h应用举例.rar

    以上只是 `string.h` 库中的一部分函数,还有其他如 `memset()`、`memcpy()` 等函数用于填充内存或复制内存块,这些在处理字符串时也有着广泛的应用。通过深入理解并熟练运用这些函数,可以提高C语言编程的效率和...

    string.h头文件.pdf

    C 语言中的`&lt;string.h&gt;`头文件是处理字符串操作的核心库,它包含了多种用于创建、复制、连接、比较、查找和修改字符串的函数。以下是对这些功能的详细说明: 1. **复制**: - `strcpy(s1, s2)`:这个函数用于将...

    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 ...

    Linux c function

    - `strcpy()`/`strncpy()`:复制字符串。 - `strcmp()`/`strncmp()`:比较字符串。 - `strlen()`:获取字符串长度。 - `strcat()`/`strncat()`:连接字符串。 - `strchr()`/`strstr()`:查找字符或子串。 8. *...

    string有关的所有函数

    除了这些函数,`string.h`头文件还包含许多其他与字符串操作相关的函数,如`strcpy`、`strcat`、`strlen`、`strncpy`、`strncat`等,它们分别用于字符串的复制、连接、长度计算、安全的复制和连接等操作。...

    PL0语言涉及的头文件.pdf

    3. `strcpy`用于将一个字符串完全复制到另一个字符串。 4. `strncpy`是有限长度的字符串复制,可以指定最多复制的字符数。 5. `strcat`将一个字符串附加到另一个字符串的末尾。 6. `strncat`类似`strcat`,但仅连接...

    The Standard C Library

    `string.h`头文件包含了处理C风格字符串的函数,如`strcpy`、`strncpy`用于复制字符串,`strcmp`、`strncmp`进行字符串比较,`strlen`返回字符串长度,`strcat`和`strncat`用于连接字符串,`strchr`和`strstr`则用于...

    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编程库函数

    - `strlen`计算字符串长度,`strcpy`和`strncpy`复制字符串,`strcat`和`strncat`连接字符串。 - `strcmp`和`strncmp`比较字符串,`strstr`查找子字符串。 5. **数组和指针操作**: - `memcpy`和`memmove`用于...

    C语言函数集(比较全)

    C语言函数库主要包括标准库(stdio.h, string.h, math.h等)和一些系统特定的函数。以下是一些关键的C语言函数类别和知识点: 1. 输入/输出函数: - `printf` 和 `scanf`:这是最常用的输入输出函数,分别用于格式...

    PL0语言涉及的头文件.docx

    `strcat`和`strncat`用于字符串连接,`strcat`不检查长度,`strncat`则有长度限制;`strcmp`进行字符串比较,返回正、负或零值表示字符串的相对顺序;`strcoll`是针对非ASCII字符集的字符串比较;`strncmp`按指定...

    linuxC库函数

    `strcpy()`和`strncpy()`用于复制字符串,`strlen()`返回字符串长度,`strcmp()`比较两个字符串,`strcat()`和`strncat()`用于连接字符串,`strchr()`和`strstr()`则分别用于查找字符和子字符串。 5. 文件操作: `...

    C 语言库函数使用手册

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

Global site tag (gtag.js) - Google Analytics