显示标签为“strcpy”的博文。显示所有博文
显示标签为“strcpy”的博文。显示所有博文

2009年3月27日星期五

Memset,Strcpy, memcpy

Memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘\0’;

例:char a[100];memset(a, '\0', sizeof(a));

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);

memcpy 用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度。

例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),会造成b的内存地址溢出。

Strcpy 就只能拷贝字符串了,它遇到'\0'就结束拷贝。

例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个‘\0’之前)是否超过50位,如超过,则会造成b的内存地址溢出。

str也可以用用个参数的strncpy(a,b,n)

========================================================

memset主要应用是初始化某个内存空间。
memcpy是用于copy源空间的数据到目的空间中。
strcpy用于字符串copy,遇到‘\0’,将结束。

如果你理解了这些,你应该知道他们的区别:例如你初始化某块空间的时候,用到memcpy,那么应该怎么写,是不是显得很笨。
int m[100]
memset((void*)m,0x00,sizeof(int)*100);//Ok!
memcpy((void*)m,"\0\0\0\0....",sizeof(int)*100);//it’s wrong.

2008年1月9日星期三

常用的字符串处理函数

字符串标准函数的原型在头文件string.h中。

1.输入字符串──gets()函数

(1)调用方式:gets(字符数组)

(2)函数功能:从标准输入设备(stdin)──键盘上,读取1个字符串(可以包含空格),并将其存储到字符数组中去



(3)使用说明


1)gets()读取的字符串,其长度没有限制,编程者要保证字符数组有足够大的空间,存放输入的字符串。

2)该函数输入的字符串中允许包含空格,而scanf()函数不允许。


2.输出字符串──puts()函数

(1)调用方式:puts(字符数组)

(2)函数功能:把字符数组中所存放的字符串,输出到标准输出设备中去,并用‘\n’取代字符串的结束标志‘\0’

。所以用puts()函数输出字符串时,不要求另加换行符。

( 3)使用说明

1)字符串中允许包含转义字符,输出时产生一个控制操作。

2)该函数一次只能输出一个字符串,而printf()函数也能用来输出字符串,且一次能输出多个。


3.字符串比较──strcmp()函数

(1)调用方式:strcmp(字符串1 ,字符串2)

其中“字符串”可以是串常量,也可以是1维字符数组。

(2)函数功能:比较两个字符串的大小。

如果:字符串1=字符串2,函数返回值等于0;

字符串1字符串2,函数返回值正整数。

(3)使用说明

1)如果一个字符串是另一个字符串从头开始的子串,则母串为大。

2)不能使用关系运算符“==”来比较两个字符串,只能用strcmp() 函数来处理。

[案例6.7] gets函数和strcmp函数的应用。

/*案例代码文件名:AL6_7.C*/

/*功能:简单密码检测程序*/

#include "stdio.h"

main()

{char pass_str[80]; /*定义字符数组passstr*/

int I=0;

/*检验密码*/

while(1)

{clrscr();

printf("请输入密码\n");

gets(pass_str); /*输入密码*/

if(strcmp(pass_str,“password”)!=0) /*口令错*/

printf("口令错误,按任意键继续");

else

break; /*输入正确的密码,中止循环*/

getch();

I++;

if(I==3) exit(0); /*输入三次错误的密码,退出程序*/

}

/*输入正确密码所进入的程序段*/

}



4.拷贝字符串──strcpy()函数

(1)调用方式:strcpy(字符数组, 字符串)

其中“字符串”可以是串常量,也可以是字符数组。

(2)函数功能:将“字符串”完整地复制到“字符数组”中,字符数组中原有内容被覆盖。

(3)使用说明


1)字符数组必须定义得足够大,以便容纳复制过来的字符串。复制时,连同结束标志'\0'一起复制。

2)不能用赋值运算符“=”将一个字符串直接赋值给一个字符数组,只能用strcpy()函数来处理。


5.连接字符串──strcat()函数

(1)调用方式:strcat(字符数组, 字符串)

(2)函数功能:把“字符串”连接到“字符数组”中的字符串尾端,并存储于“字符数组”中。“字符数组”中原来

的结束标志,被“字符串”的第一个字符覆盖,而“字符串”在操作中未被修改。

(3)使用说明

1)由于没有边界检查,编程者要注意保证“字符数组”定义得足够大,以便容纳连接后的目标字符串;否则,会因

长度不够而产生问题。

2)连接前两个字符串都有结束标志'\0',连接后“字符数组”中存储的字符串的结束标志'\0'被舍弃,只在目标串


的最后保留一个'\0'。


6.求字符串长度──strlen()函数(len是length的缩写)

(1)调用方式:strlen(字符串)

(2)函数功能:求字符串(常量或字符数组)的实际长度(不包含结束标志)。


7.将字符串中大写字母转换成小写──strlwr()函数

(1)调用方式:strlwr(字符串)

(2)函数功能:将字符串中的大写字母转换成小写,其它字符(包括小写字母和非字母字符)不转换。


8.将字符串中小写字母转换成大写──strupr()函数

(1)调用方式:strupr(字符串)

(2)函数功能:将字符串中小写字母转换成大写,其它字符(包括大写字母和非字母字符)不转换。


C语言是通过函数来实现模块化程序设计的。所以较大的C语言应用程序,往往是由多个函数组成的,每个函数分别对应

各自的功能模块。