详解C语言字符串、字符、字节

字符串基础

字符串是一串零个或多个字符,并且以一个位模式为全0的NULL字节结尾。

  • 字符串所包含的的字符内部不能出现NULL字节;
  • NUL字节是字符串的终结符,但它并不是字符串的一部分,所以字符串的长度并不包含NULL字节;

字符串的长度

字符串的长度就是它所包含的字符个数,通常使用函数strlen来计算字符串的长度。

sizet_t strlen(char const *string);

size_t定义在stddef.h中,它是一个无符号整数类型。
  在表达式中使用无符号数可能导致不必要的 结果,如下:

if(strlen(x) >= strlen(y))...
if(strlen(x) - strlen(y) >= 0)...

第二条语句永远为真,因为strlen(x)/strlen(y)的返回值都是无符号数,所以>=左边是无符号数,无符号数不可能小于零。

不受限制的字符串函数

最常用的字符串函数都是不受限制的,就是说它们只是通过寻找字符串参数结尾的NULL来判断呢它的长度。在使用这些函数时,必须要保证结果字符串不会溢出内存

复制字符串

用于复制字符串常用的函数时strcpy,函数原型如下:

char  *strcpy(char *dst,char *src);
  • 函数strcpy把参数src字符串你复制到dest,如果src和dest的内存空间重合,其结果是未定义的;
  • 由于dest参数将进行修改,所以它必须是一个字符数组或者指向一个动态分配内存的指针,不能是常量;
  • 函数的返回值是是指向参数srcd的一份拷贝,就是指向目标数组的指针;

连接字符串

把一个字符连接到一个字符后面,可以使用strcat函数,其原型如下:

char *strcat(char *des,char *src);
  • strcat函数要求des参数已经包含一个字符串(可以是空字符串);
  • 函数strcat好到字符串des的末尾,并把src字符串拷贝到这个位置;
  • 函数的返回值是是指向参数srcd的一份拷贝,就是指向目标数组的指针;

字符串的比较

比较字符串所使用的函数是strcmp,这个函数按字典顺序逐个比较字符,其原型如下:

int strcmp(char const *s1,char const *s2);
  • 如果s1小于s2,返回一个小于零的值;
  • 如果s1等于s2,返回值为零;
  • s1大于s2,返回一个大于零的值;

长度受限制的字符串函数

标准库还包含了一些函数,这些函数接受一个显式的长度参数,用于限定金系能复制或比较的字符串的字符数,他们的原型如下:

char *strncpy(char *dst,char connst *src,size_t len);
char *strncat(char *dst,char connst *src,size_t len);
int strncmp(char const *s1,char const *s2,size_t len);

注意,在strncpy函数中:

  • 如果len大于strlen(src),dst数组就用额外的NULL字节填充到len长度;
  • 如果len小于strlen(src),那么只有len个字节被复制到dst中,但它的结果不以NULL结尾
  • strncat函数不同于函数strncpy,它从src中最多复制len个字符到dst中,但是strncat总是在结构后面添加一个NULL字节,不像strncpy对目标数组用NULL字节进行填充;
  • strncmp函数在len个字符前存在不相等的字符,则停止比较,返回结果;

字符串查找基础

查找一个字符

在一个字符串中查找一个特定的字符最常使用的就是strchr和strrchr函数,其原型如下:

char *strstr(char const *str,int ch);
char *strstr(char const *str,innt ch);
  • 函数的第二个参数式整型值,但是,它包含了一个字符型值;
  • strchr函数在字符串src中查找ch第一次出现的位置;
  • strrchr函数在字符串中查找ch最后一次出现的位置;
  • 函数的返回值为指向字符出现位置的指针,没查找到返回NULL;

查找任何几个字符

查找任何一组字符第一次出现在字符串中的位置使用函数strpbrk,其原型如下:

char *strpbrk(char const *str,char cont *group);
  • 函数返回一个指向str中第一个匹配group中任何一个字符的字符位置,如果未找到匹配的返回一个NULL指针;
  • 函数区分大小写;

查找一个字符串

strstr函数用于查找一个字符串,其原型如下:

char *strstr(char const *s1,char const *s2);
  • strstr函数在s1中查找整个s2第一次出现的位置,并返回一个指向该位置的指针;
  • 如果s2并没有完整的出现在s1中,函数返回一个NULL指针;
  • 如果s2是一个空字符串,函数返回s1;

错误信息

strerror函数把操作系统设置的外部整形变量error其中的一个作为参数并返回一个指向用于描述错误的字符串的指针,其原型如下:

char *strerror(int error_number);

字符操作

标准库包含了两组函数,用于操作单独的字符,他们的原位于ctype.h中,第一组用于字符分类/判断,第二组用于转换字符。

字符分类

函数 如果它的参数符合下列条件就返回为真
iscntrl 任何控制字符
isspace 空白字符,空格 ' ',换页'\f',换行'\n',回车'\r',制表符/垂直制表符 '\t'/'v'
isdigit 数字0-9
isxdigit 十六进制数字,数字0-9,小写字母a-f,大写字母A-F
islower 小写字母a-a
isupper 大写字母A-Z
isalpha 字母a-z,A-Z
isalnum 字母或数字,a-z或0-9
ispunct 标点符号,任何不属于字母或数字的图形字符(可打印符号)
isgraph 任何图形字符
isprint 任何可打印字符,包括图形字符或空白字符

字符转换

  转化函数把大写字母转换成小写字母或小写字母转换成大写字母

int tolower(int ch);
int toupper(int ch);
  • 函数tolower返回字符ch 对应的小写形式的整型值;
  • 函数toupper返回字符ch 对应的大写形式的整型值;
  • ch并不是处于一个适当的大小写状态,函数将不修改参数直接返回;

内存操作

  当字符串中函含有NULL字符,此时将不能在使用字符串操作函数,内存操作函数将任意的字符串序列,包含字符串中含有NULL字符的字符串,它们的函数原型如下:

void *memcpy(void *dst,void const *src,size_t length);
void *memmove(void *dst,void const *src,size_t length);
void *memcmp(void const *a,void const *b,size_t length);
void *memchr(void const *a,int ch ,size_t length);
void *memset(void *a,int ch,size_t length );
  • 以上函数与字符串函数不同之处在于它们遇到NULL不会停止操作;
  • memmove函数的src和dst的内存空间可以重合;
  • memcmp函数对两端内存的内容进行比较,这些值将按照无符号字符诸字节比较,若用该函数比较非单字节的数据如整数或浮点数将出现不可预料的结果;
  • memchr函数从a的起始位置开始查找字符ch第一次出现的位置,最多查找length个字节,如果在这length个字节中未找到,函数返回一个NULL指针;
  • memset函数把a开始length个字节全部设置为字符值ch,如把buffer的前SIZE个字节都初始化为0:
memset(buffer,0,SIZE);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352

推荐阅读更多精彩内容

  • 一、字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 s...
    JaiUnChat阅读 1,656评论 0 7
  • 本文转自:http://www.cnblogs.com/lidabo/p/5225868.html 1)字符串操作...
    XiaohuiLI阅读 9,511评论 0 0
  • 在c语言中,字符串是用字符数组来存储的(并不像c++或者java等语言中有单独的string类型), 存放时在字符...
    朱森阅读 1,560评论 0 2
  • “我对生命的一种最深刻的感悟就是:要完成最渴望的目标,战胜最艰巨的挑战,你必须发掘并应用一些原则或法则,因为它们恰...
    夏沫er阅读 485评论 1 2
  • 我来自淳朴的乡间 做事勤快 长相安全 像高粱一样 喜欢着沉默的大地 也像大地一样喜欢沉默 放心地使用我吧 就算在城...
    宁蓝凌阅读 1,426评论 0 3