C注意,使用的语言字符串
转载请注明出处!
在C语言没有具体的字符串数据类型,字符串的字符串常量和字符数组的形式。
实际上该字符串是零个或更多字符的字符串。并在整个位模式0NUL字节结束。因此,字符串所包括的字符内部不能出现NUL字节。头文件string.h包括了使用字符串函数所需的原形和声明。虽然并不是必须。但在程序里包括这个头文件确实是个好主意。由于有了它所包括的原型,编译器能够更好地为你的程序运行错误检查。
以下列举了在使用C库中字符串函数时的注意事项,此内容会持续的更新!
1.字符串长度
size_t strlen(cha const *string);
注意函数的返回值为无符号整数,size_t在stddef.h中定义,假设在表达式中使用无符号整数可能导致不可预料的结果。比如以下的两个表达式看上是相等的:
if (strlen(x) >= strlen(y))...
if(strlen(x) - strlen(y) >= 0)...
其实,它们是不相等的。第一个表达式没有问题,可是第二个表达式因为strlen的返回值为无符号的,所以>= 左边的表达式也是无符号的,所以该表达式是永远为真的!
2. 不受限制的字符串函数
我们常常使用的字符串函数都是"不受限制的",即它们都是通过寻找字符串參数结尾的NUL字符来推断它的长度的。这些函数一般都会指定一块内存用于存放结果字符串,程序猿须要自己保证结果结果字符串不能超过该块内存区域。
2.1. 复制字符串
用于复制字符串的函数strcpy的函数原型例如以下:
char * strcpy(char *dst, const char*src);
该函数会将src中的字符串拷贝到dst中,假设两个字符串中存在重叠的部分,其结果是没有定义的。
目标參数曾经的内容会被覆盖并丢失,即使src比dst的长度更短。
比如:
<pre name="code" class="cpp">char str[] = "Hello, China!"
strcpy(str, "NiHao"); printf("str = %s\n", str); Output:
NiHao
程序猿必须保证目标字符数组的空间足以容纳被复制的字符串。假设字符串比字符数组长,多余的字符相同地被复制,它们会覆盖原先存储于数组之后的内存空间的数据,strcpy无法解决问题,他不能推断目标字符数组的长度!
2.2连接字符串
strcat讲一个字符串拼接到还有一个字符串的后面,其原型例如以下:
char *strcat(char *dst, char const *src);
strcat要求dst中包括一个字符串(能够为空字符串),其搜索到该字符串的末尾,并将src中的字符串复制到该位置。假设src和dst存在重叠,其结果是没有定义的。
相同。程序猿必须保证dst字符数组的空间能容纳dst和src总的字符长度!
2.3 字符串比較
字符串的比較原理为对两给字符串逐个比較,直到发现不匹配为止。strcmp的函数原型为:
int strcmp(char const *s1, char cosnt *s2);
假设s1<s2,其返回小于零的值。假设s1大于s2,其返回一个大于零的值。假设相等其返回零。
对于字符串是否相等的推断有的人写法例如以下:
if(!strcmp(s1,s2)) 把这个返回值当做布尔值进行測试一种坏风格。由于它有三个不同的返回值:小于。等于,大于。更好地方法为
if(strcmp(s1, s2) == 0)
strcmp的參数必须以NUL字节结尾。否则其会对參数后面的字节进行比較,这样做是没有意义的。
3. 长度受限的字符串函数
C库中包括其它一些字符串处理函数,它们提供一个显式的长度用于限制进行复制和比較的字符串的长度,该机制能够有效的防止难以预料的长字符串从他们的目标中溢出。
相同,这些函数不能结果源參数和目标參数存在重叠的问题。
这些函数的原型例如以下:
char *strncap(char *dst, const char *src, size_t len);
char *stncat(char *dst, cosnt char *src, size_t len);
int strncmp(char cosnt *s1 , char const*s2, size_t len);
strncpy总是正好将len长度的字符复制到dst中,假设strlen(src)的值小于len, dst数组就用额外的NUL字节填充到len长度。而假设strlen(src)的值大于或等于len,那么仅仅有len个字节被复制到dst中。注意:它的结果将不会以NUL字节结尾,这一定要引起注意!
这个问题仅仅有当你使用strncpy函数创建字符串。然后使用其它str开头的库函数,或者在printf中使用%s格式打印它们时才会出现。在使用不受限制的函数之前。我们必须确定字符串实际上是以NUL字节技术的字符串,考虑以下的样例:
char buffer[BSIZE]; strncpy(buffer, name, BSIZE); buffer[BSIZE - 1] = 0;
假设name长度小于BSIZE。那么最后的赋值语句没有不论什么效果,可是假设name太长以至于超过了BSIZE,那么最后的赋值语句能够控制buffer以NUL字节结束,以后涉及该字符串的操作都能够正确运行。
strncat总是在目标字符串的末尾加入一个NUL字节。len没有讲原先的字符长度,包括,它只是管src在len复制的字符src在,和src加入的结束NUL字节。无论src串出剩余空间预先存在足够。
strncmp比较起来len字节,假设两个字符串len字符前的不平等性质,该函数返回,假定第一两串len字符等于,该函数返回零。
C注意,使用的语言字符串的更多相关文章
- C语言字符串操作总结大全(超详细)
本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat( ...
- C语言字符串拷贝
C语言字符串拷贝利用指针操作,要清楚知道指针的指向 代码如下: #include <stdio.h> #include <assert.h> #include <stri ...
- C语言字符串长度(转)
C语言字符串长度的计算是编程时常用到的,也是求职时必考的一项. C语言本身不限制字符串的长度,因而程序必须扫描完整个字符串后才能确定字符串的长度. 在程序里,一般会用strlen()函数或sizeof ...
- C语言字符串操作常用库函数
C语言字符串操作常用库函数 *********************************************************************************** 函数 ...
- c语言字符串操作大全
C语言字符串操作函数 函数名: strcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source); 程序例: #incl ...
- 转:C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文
转自:C语言字符串操作函数 - strcpy.strcmp.strcat.反转.回文 C++常用库函数atoi,itoa,strcpy,strcmp的实现 作者:jcsu C语言字符串操作函数 1. ...
- C 语言字符串连接的 3种方式
C 语言字符串连接的 3种方式 #include<stdio.h> #include<stdlib.h> #include<string.h> char *join ...
- C语言字符串声明
重新学习C语言字符串声明char *a="nihao";char a[]="nihao";什么区别?前者定义的是指针,并且指向字符串常量“nihao”,后者是字 ...
- C语言字符串操作函数整理
整理C语言字符串相关的函数,以程序方式验证,以注释方式做说明. #include<stdio.h> #include<string.h> #include<stdlib. ...
- 13-C语言字符串函数库
目录: 一.C语言字符串函数库 二.用命令行输入参数 回到顶部 一.C语言字符串函数库 1 #include <string.h> 2 字符串复制 strcpy(参数1,参数2); 参数1 ...
随机推荐
- socket套接字TCP API
socket套接字TCP API socket概念 socket又称"套接字",是计算机网络中进程间通信数据通道的一个端点.或称之为句柄.IP地址+port号就能够唯一确定一个so ...
- jQuery整理笔记5----jQuery大事
一.大事 1.载入中DOM $(document).ready() 这个第一节里具体介绍了 2.事件绑定 jQuery定义了bind()方法作为统一的接口.用来为每个匹配元素绑定事件处理程序.其基本的 ...
- UVa 10285 - Longest Run on a Snowboard
称号:给你一个二维矩阵,找到一个点.每一个可以移动到的位置相邻的上下,求最长单调路径. 分析:贪婪,dp.搜索. 这个问题是一个小样本,我们该怎么办. 这里使用贪心算法: 首先.将全部点依照权值排序( ...
- IIS7安装场景对照表
原文 IIS7安装场景对照表 Default Server Install Components Server Manager Update Name Static Content IIS-Stati ...
- SpringAccess数据库(oracle)构造
陈科朝:http://blog.csdn.net/u013474104/article/details/44279309 ================ 1.spring 对数据库訪问的支持 当我们 ...
- Ohloh研究报告
1.底 由于近期接合ospaf同样是一个开源项目的成熟度分析工具,由于该项目现在Ohloh我们有共同的东西,这么ohloh我们进行了调查. 简单的说,初始ohloh是一个代码搜 ...
- zoj 3659 并检查集合
http://acm.zju.edu.cn/onlinejudge/showProblem.do? problemId=4882 现在在牡丹江,明天regional直播比赛,我会在一个月内退休.求祝福 ...
- js中的open和showModalDialog
一.window.open()支持环境: JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+ 二.基本语法:window.open(pageURL,name,p ...
- Javascript学习7 - 脚本化浏览器窗口
原文:Javascript学习7 - 脚本化浏览器窗口 本节讨论了文档对象模型.客户端Javascript下Window中的各项属性,包括计时器.Location对象.Histroy对象.窗口.浏览器 ...
- spring中<tx:advice></tx:advice>是什么意思
<tx:advice id="tv" transaction-manager="transactionManager"> <tx:attrib ...