零基础全日制string_第1页
零基础全日制string_第2页
零基础全日制string_第3页
零基础全日制string_第4页
零基础全日制string_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言-字符串麦洛克菲-周扬荣任何一个程序中,至少有20%的代码是在处理字符串字符串定义所谓字符串是由零个或多个字符组成的有限序列。C语言字符串可以定义为:”\0”。从定义的形式可以看出,C语言的字符串是以’\0’结尾的(换句话说:只要遇到’\0’,字符串就结束了)。程序在存放字符串的时候,会自动在字符后面加上一个’\0’作为结尾。比如:“Thisis

astring”—由引号包含起来的。那么这个字符串的实际存放形式为:虽然肉眼看不到字符串结尾的那个’\0’,但是在存储空间,在末尾却可以看到’\0’是存在的。所以,字符串实际上也是一个以’\0’作为最后一个元素的字符数组。“hello\0world”字符串常量“Hello

world”“a”//注意与’a’的区别“”“0”//’0’和’\0’,0,NULL“my

name

is\“mallocfree\”!”“D:\\MallocFreeIBM\\language\\1c\\6-string\\”char

*str

=

“hello

world”;char

str[]=

“hello

world”;“123”<—>123转义字符C语言字符串是由引号包含,且以零结尾的由零个或多个字符组成的有限序列。那么,假如双引号本身也是字符串中的一个字符,怎么办呢?比如下面这句话:This

is

a

“real”

special

dream如果要用一个双引号来把这句话包含起来,就变成了:“This

is

a

“real”special

dream”//错误“This

is

a

\“real\”special

dream”//正确常见的转义字符“C:\Doc\1.txt”

’“C:\\Doc\\1.txt”

’C’,’:’,’\D’,’o’,’c’,’\1’,’.’,’t’,’x’,’t’,’\0’C’,’:’,’\’,’D’,’o’,’c’,’\’,‘1’,’.’,’t’,’x’,’t’,’\0’\1270127-->"\127"\x3a0x3a-->"\x3a""there

is

an

\'e\'

in

\"hello\""程序中使用字符串:/*1*/char

*str

=

“this

is

a

string”;/*2*/char

str2[]=

“this

is

a

string”;/*3*/char

str3[100]

=

“this

is

a

string”;/*4*/char

str4[]=“hello\0world”语句1将”thisisastring”赋值给了字符指针str。此时,str的值为”thisisastring”的第一个字符的地址。实际上,”this

isastring”这个常量字符串存储在C语言程序的常量区。而str即指向了存储这个常量字符串的首地址。语句2会将常量区中的”thisisastring”拷贝到数组里面。并且数组的长度将为”this

is

a

string”(包含’\0’)的长度。语句3会将常量区中的”this

is

a

string”拷贝到数组里面。并且数组的长度将为

100个字节。语句3和语句2的区别是语句2没有指明数组的长度,那么数组的长度就是字符串的长度。对于上面的3个字符指针变量,分别使用sizeof和strlen的计算结果又是什么呢?sizeof(str)=为指针的长度,所以在X86上是4,在X64上是8。sizeof(str2)=17。str2数组的长度,但str2没有显示指出数组的长度,而是按照分配给它的字符串的长度来分配。所以,值为17。sizeof(str3)=100。Sizeof计算的是str3数组的长度,所以结果为100。strlen(str)=16。Strlen计算的是字符串的字符个数(不含’\0’)。strlen(str2)=16。原因同上。strlen(str3)=16。原因同上。程序中使用字符串char

*p

=

(char

*)malloc(128);if

(p

==NULL)return;memset(p,

0,

128);memcpy(p,

“hello

world”,

strlen(“helloworld”)+1);这样,以p为首地址的内存中将存放着”helloworld”这个字符串。多字节字符串和宽字符字符串在C语言中,还应该区分一个多字节字符串和宽字符字符串的概念。在多字节字符串中,每个字符的编码宽度都不等,可以是一个字节,也可以是多个字节。比如:char

*

str=“Hello,

world!您好,世界!”。上面是一个多字节字符串。其中的英文字符占一个字节,而中文字符占2个字节。而宽字符串中,每个字母占用的字节数是一样的。比如:wchar_t

*wstr=L“Hello,world!您好,世界!”上面是一个宽字符串。其中每个字符,无论英文字母还是中文字符还是结尾的零(’\0\0’),都占2个字节(UNICODE编码)。可以调用wctomb()等函数将宽字符串与多字节串进行相互转换。字符串常见操作strcmp:比较一个字符串是否相等,而且大小写敏感,相等返回零

stricmp:比较一个字符串是否相等,而且大小写不敏感strncmp:比较2个字符串前N个字符,大小写敏感

strnicmp:

比较2个字符串前N个字符,大小写不敏感字符串遍历char

*str=“hello

world!”;while(*str!=‘\0’){printf(“%c”,

*str);str++;}for(;*str!=‘\0’;str++){printf(“%c”,

*str);}for(int

i=0;

str[i]!=‘\0’;i++){printf(“%c”,

str[i]);}字符串库函数应用strlenstrcpy/strncpystrcmp/stricmp/strnicmpstrcat/strncatstrchr/strrchrstrstrstrtokatofatoiatolatollstrcpy_sstrcat_sscanf_swcslenwcscpy..._tcslen_tcscpy自己实现字符串操作strstrstrcmpstrlenstrcpy…字符串与字符数组char

name1[]={‘h’,’e’,’l’,’o’};char

name2[]={‘h’,’e’,’l’,’o’,’\0’};char

name3[]=“hello”;最后一个字符是’\0’的字符数组就是字符串。

所以name1是字符数组,不是字符串。name2和name3都是字符串。字符串数组char

name1[3][20]={“tom”,”jack”,”david”}char

*name2[3]={“tom”,”jack”,”david”}sizeof(name1)?sizeof(name2)?作业下面的定义有什么区别?sizeof,strlen的值分别是?char

*s1=“Helloworld”;char

s2[]=“Hello

wor

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论