C语言字符串与指针(3)

2019-03-16 14:44

int main(void) {

char *str1 = \ ptr = strstr(str1, str2);

printf(\ return 0; }

函数名: strtod

功 能: 将字符串转换为double型值

用 法: double strtod(char *str, char **endptr); 程序例:

#include #include int main(void) {

char input[80], *endptr; double value;

printf(\ gets(input);

value = strtod(input, &endptr);

printf(\ return 0; }

函数名: strtok

功 能: 查找由在第二个串中指定的分界符分隔开的单词 用 法: char *strtok(char *str1, char *str2); 程序例:

#include #include int main(void) {

char input[16] = \ char *p;

/* strtok places a NULL terminator in front of the token, if found */ p = strtok(input, \ if (p) printf(\

/* A second call to strtok using a NULL as the first parameter returns a pointer to the character following the token */ p = strtok(NULL, \ if (p) printf(\ return 0; }

函数名: strtol

功 能: 将串转换为长整数

用 法: long strtol(char *str, char **endptr, int base); 程序例:

#include #include int main(void) {

char *string = \ long lnumber;

/* strtol converts string to long integer */ lnumber = strtol(string, &endptr, 10);

printf(\ long = %ldn\ return 0; }

函数名: strupr

功 能: 将串中的小写字母转换为大写字母 用 法: char *strupr(char *str); 程序例:

#include #include int main(void) {

char *string = \ /* converts string to upper case characters */ ptr = strupr(string); printf(\ return 0; }

函数名: swab 功 能: 交换字节

用 法: void swab (char *from, char *to, int nbytes); 程序例:

#include #include #include

char source[15] = \ char target[15]; int main(void) {

swab(source, target, strlen(source)); printf(\ return 0; }

PS:isalpha()是字符函数,不是字符串函数,

isalpha

原型:extern int isalpha(int c);

用法:#include

功能:判断字符c是否为英文字母

说明:当c为英文字母a-z或A-Z时,返回非零值,否则返回零。

举例:

// isalpha.c

#include #include #include

main()

{

int c;

clrscr(); // clear screen printf(\ for(;;) {

c=getchar(); clrscr();

printf(\ }

return 0; // just to avoid warnings by compiler }

关于C语言字符串函数的思考

C语言并不是一种很方便的语言,它的字符串就是一例。按照C语言的定义,“字符串就是一段内存空间,里面包含ASCII字符,并且,以”\\0”结尾,总共能存放n-1个字符。”按照这个描述,字符串处理确实很麻烦,还很容易出错。

为了方便用户,C语言标准库向用户提供了一些字符串函数,如字符串拷贝、构造、清空等函数,在一定程度上方便了用户的使用。但是,我无意中发现,这些函数还是有些隐患的。

事情很简单,我注意到我写的一些程序,老是有内存读写错误,但是,经过仔细检查我所有的数据Buffer,以及相关的处理函数,又没有找到什么错误。于是我把怀疑的目光投向我常用的一些字符串处理函数上,如strcpy、sprintf等。在经过几次仔细地跟踪之后,我发现内存错误出自于此。于是,我开始研究如何安全地使用字符串这个话题。

1 字符串拷贝函数 1.1 不安全的strcpy 首先,我写了这样一个测试函数:

void strcpyTest0() {

int i;

char szBuf[128];

for(i=0;i<128;i++) szBuf[i]='*';

szBuf[127]='\\0'; //构造一个全部是*的字符串

char szBuf2[256];

for(i=0;i<256;i++) szBuf2[i]='#';

szBuf2[255]='\\0'; //构造一个全部是#的字符串

strcpy(szBuf,szBuf2);

printf(\

}

很简单,把一个字符串拷贝到另外一个空间,但是,很不幸,源字符串比目标地址要长,因此,程序很悲惨地死去了。

1.2 还是不安全的strncpy

通过上例,我发现我需要在拷贝时多输入一个参数,来标明目的地址有多长,检查C语言的库函数说明,有一个strncpy可以达到这个目的,这个函数的原型如下:

char *strncpy( char *strDest, const char *strSource, size_t count );

好了,这下我们的问题解决了,我写出了如下代码:

void strcpyTest1()

{

int i;

char szBuf[128];

for(i=0;i<128;i++) szBuf[i]='*';

szBuf[127]='\\0';

char szBuf2[256];

for(i=0;i<256;i++) szBuf2[i]='#';

szBuf2[255]='\\0';

strncpy(szBuf,szBuf2,128);


C语言字符串与指针(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:SNCR+SCR方案 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: