




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章字符串第10章字符串本章学习内容字符串常量字符串处理函数字符数组和字符指针向函数传递字符串从函数返回一个字符串指针本章学习内容字符串常量10.1字符串常量用双引号括起的一串字符是字符串常量,C语言自动为其添加'\0'结束符"Howareyou"一串以‘\0’结尾的字符序列在C语言中被看作字符串。ASCII码值为010.1字符串常量用双引号括起的一串字符是字符串常量,C语言4字符串的存储在内存中连续存储,以字符’\0’为结束标识C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串,使用字符数组或字符指针来处理字符串HelloWorld\010.2字符串的存储4HelloWorld\010.2字符串的存储说明:’\0’代表ASCII码为0的字符,从ASCII码表中可以查到,ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不做。用它来作为字符串结束标志不会产生附加的操作或增加有效字符,只是一个供辨别的标识。5说明:56字符数组字符数组每个元素都是字符类型的数组。它的每个元素存放一个字符(占一个字节)字符数组的定义如charc[10];数组c是一维数组,它可以存放10个字符,或者一个长度不大于9的字符串如charname[3][10];数组c是二维数组,它可以存放30个字符,或者3个长度不大于9的字符串注意:字符串只能存放在字符数组中6字符数组字符数组7一维字符数组的初始化用字符常量赋值 如:charc[5]={'C','h','i','n','a'};又如:
charc[6]={'C','h','i','n','a','\0'};再如:charc[7]={'C','h','i','n','a'};ChinaChina\0不是字符串是字符串China\0\07一维字符数组的初始化用字符常量赋值ChinaChina\08用字符的ASCII码赋值如:charc[6]={67,104,105,110,97,0};用字符串常量赋值
如:charc[6]={“China”};或者charc[6]=“China”;China\0是字符串
注:以字符串方式赋值时,必须保证数组元素个数≥字符个数+1,(字符串后面需自动加上一个'\0')。China\08用字符的ASCII码赋值China\0是字符串注:以字符9一维字符数组的初始化省略数组长度
如:charc[]={'C','h','i','n','a'};再如:
charc[]=“China”;注意:不可以为数组单独整体赋值,例如
charstr[10];str=“China”;ChinaChina\0是字符数组,但不代表字符串是字符串×9一维字符数组的初始化省略数组长度
ChinaChina\010.3字符指针HelloChina\0字符指针就是指向字符类型数据的指针"HelloChina"pStr10.3字符指针Hel11字符指针是指向字符型数据的指针,定义为:
char*指针;
可以用字符数组首地址为指针赋初值
chara[]="WelcometoBeijing."; char*p=a;//对于一维数组,数组名代表首地址
也可以用字符串常量为指针赋初值
char*p=“Hello”;//字符串常量本身代表首地址对p初始化,即使p指向字符串的第一个字符。11字符指针是指向字符型数据的指针,定义为:
由于p为指针变量,指针指向是可以改变的
char*p="Hello",*q=p; p="world";12由于p为指针变量,指针指向是可以改变的1213字符数组与字符指针变量比较:1、charstr[20]=“china”;
与char*p=“china”;2、str数组由20个元素组成;而p中存放字符串首地址3、charstr[20];str=“IloveChina!”;(X)char*p;p=“IloveChina!”;()4、str是地址常量;p是指针变量13字符数组与字符指针变量比较:14字符数组元素的访问可以为数组元素赋值,也输出元素的值【例】对字符数组c1赋值’0’~’9’,对字符数组c2赋值’A’~’Z’,然后输出c1和c2中的数据#include<stdio.h>voidmain(){charc1[10],c2[26];inti; for(i=0;i<10;i++)c1[i]=i+48;
for(i=0;i<26;i++)c2[i]=i+'A';
for(i=0;i<10;i++)printf("%c",c1[i]);printf("\n");
for(i=0;i<26;i++)printf("%c",c2[i]);
printf("\n");}10.4字符串的访问和输入/输出14字符数组元素的访问可以为数组元素赋值,也输出元素的值#i15字符串的输入和输出C语言中常用的字符串输入输出函数有scanf和printf、gets和puts等1、printf函数一般格式为:
printf("%s",字符数组名或字符串常量)
其中,%s为字符串格式符 例如:
charc[15]=“HelloChina!";printf("%s",c);printf(“%s”,“HelloChina!");注意:用格式%s控制输出
1.输出项一定要是地址
2.遇到‘\0’便结束输出15字符串的输入和输出C语言中常用的字符串输入输出函数有sc162、scanf函数一般格式为:
scanf(“%s”,字符数组名)
其中,%s为字符串描述符,对应的输入项是字符数组的首地址 例如:
charc[10];scanf("%s",c);注意:scanf接收数据的变量要求的是地址:
对变量(数组元素),前面才加&
对一维数组,数组名就是数组的首地址
不能加“&”162、scanf函数注意:scanf接收数据的变量要求的【例10.1】从键盘输入一个人名,把它显示在屏幕上Why?scanf函数使用空白(空格、制表符、回车符等)作为输入数据的分隔符,所以只能获取“单词”【例10.1】从键盘输入一个人名,把它显示在屏幕上Why?【例10.1】从键盘输入一个人名,把它显示在屏幕上【例10.1】从键盘输入一个人名,把它显示在屏幕上193、字符串输入函数gets()
调用格式:gets(字符数组名)
功能:从键盘输入一个字符串(以回车结束)存入字符数组中,用空字符’\0’行尾。4、字符串输出函数puts()
调用格式:puts(字符数组名或字符串常量本身)
功能:输出一个字符串,输出后自动换行
即puts(str)与printf("%s\n",str)等价使用gets()函数允许在字符串中输入空格193、字符串输入函数gets()即puts(str)与用puts函数输出的字符串中可以包含转义字符。例如:charstr[]={“China\nBeijing”};puts(str);
输出:ChinaBeijing
在输出完字符后自动换行。20用puts和gets函数只能输出或输入一个字符串,不能写成puts(str1,str2)
或gets(str1,str2)用puts函数输出的字符串中可以包含转义字符。例如:20用p21#include<stdio.h>voidmain(){charstr[15];printf("输入一个字符串:");
gets(str);printf(“\n输入的字符串是:");
puts(str);}字符串的输入和输出使用gets函数允许输入空格输入一个字符串:HelloChina输入的字符串是:Hello
ChinaHelloChina\021#include<stdio.h>字符串的输入和输出使22【例】输入一句话,统计空格的个数#include<stdio.h>voidmain(){charline[80];inti,count;printf("\n请输入一行字符:\n");
gets(line);
i=0,count=0;while(line[i]!='\0')
{if(line[i]=='')count++; i++;}printf("\n其中的空格总数为%d\n",count);}for(i=0,count=0;line[i]!='\0';i++)if(line[i]=='')count++;22【例】输入一句话,统计空格的个数#include<st【例10.2】使用函数gets(),从键盘输入一个带有空格的人名,然后把它显示在屏幕上【例10.2】使用函数gets(),从键盘输入一个带有空格的c语言课件《字符串》解读能够限制输入字符串的长度从标准输入stdin中读取一行长度为sizeof(name)的字符串送到name为首地址的缓冲存储区去能够限制输入字符串的长度从标准输入stdin中读取一行长度为【例10.3】从键盘输入一个带有空格的人名,然后在显示人名的前面显示"Hello",Isaidto【例10.3】从键盘输入一个带有空格的人名,然后在显示人名的【例10.3】从键盘输入一个带有空格的人名,然后在显示人名的前面显示"Hello",Isaidto【例10.3】从键盘输入一个带有空格的人名,然后在显示人名的10.5字符串处理函数10.5字符串处理函数29字符串数组字符串数组是存放了若干字符串的字符数组,是一个二维数组,每个字符串占一行,字符串的个数对应数组的行数;字符串数组的定义为:char数组名[字符串个数][字符串长度]如:charstr[3][20];29字符串数组字符串数组是存放了若干字符串的字符数组,是一个30字符串数组的初始化:chara[3][8]={"str1","str2","string3"};charb[][6]={"s1","st2","str3"};字符串的引用将字符串数组当作一维数组使用,这个一维数组中的每个元素是个一维数组:{a[0],a[1],a[2]}引用二维字符数组的行下标:a[0],a[1],a[2]str1str2\0\0string3\0\0\0\0\0\0\0a[0]a[0][0]a[1]a[2]数组a初始化后的存储情况30字符串数组的初始化:str1str2\0\0string31【例】输入数字星期几(星期天用0表示),输出对应的英文名称分析: 建立如下星期表:用二维字符数组存储星期表,每行存一个字符串Sunday\0Monday\0Tuesday\0Wednesday\0Thursday\0Friday\0Saturday\001234560123456789\0\0\0\0\0\0\0\0\0\0\0\0\0SundayMondayTuesdayWednesdayThursdayFridaySaturday012345631【例】输入数字星期几(星期天用0表示),输出对应的英文名32#include<stdio.h>voidmain(){charw_day[][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
intnum;printf("Enteranumber(0~6):");scanf("%d",&num);if(num>=0&&num<=6)printf("%d:%s\n",num,w_day[num]);elseprintf("Errornumber!\n");}do{printf("Enteranumber(0~6):");scanf("%d",&num);}while(num<0
||num>6);32#include<stdio.h>do33字符串处理函数与字符串有关的函数在头文件string.h中定义要使用标准库字符串处理函数,程序前应该包含:
#include<string.h>string.hstrlenstrcpystrcmpstrcat……33字符串处理函数与字符串有关的函数在头文件string.h34字符串的长度字符串的长度是字符串中位于\0之前的字符的个数根据字符串中
\0的位置来计算字符串长度。 若:数组中下标为i
的元素为\0,则,串长=
i。例:求字符串的长度#include<stdio.h>voidmain(){ intlength=0; charstr[30];printf("InputaString:");gets(str);
while(
str[length]!='\0'
)
length++; printf("\nStringlengthis%d\n",length);}abcdefg\0串长length=7length=0length=1length=234字符串的长度字符串的长度是字符串中位于\0之前的字符35求字符串长度函数求字符串长度函数
语法格式:strlen(字符数组名);
功能:计算字符串中字符的个数,并将字符的个数作为函数的返回值,不包括字符\0。#include<string.h>#include<stdio.h>voidmain(){intlength=0;charstr[30];printf("InputaString:");gets(str);while(
str[length]!='\0'
)length++;printf("\nStringlengthis%d\n",length);}length=strlen(str);35求字符串长度函数求字符串长度函数#include<st36字符串复制函数字符串复制函数
语法格式:strcpy(dest,src);
功能:把字符数组src中的字符串拷贝到字符数组dest中,\0也一同拷贝。src也可以是一个字符串常量。函数调用后返回的是字符数组dest的首地址。#include<stdio.h>#include<string.h>intmain(void){ charsource[]="Wechangelives"; chartarget[20];
strcpy(target,
source); printf("\n源字符串=%s",source); printf("\n目标字符串=%s\n",target);return0;}目标数组名源字符串=Wechangelives目标字符串=Wechangelivestarget=source;?字符串不能直接整体赋值必须借助strcpy!源数组名36字符串复制函数字符串复制函数#include<stdi37字符串比较函数字符串比较函数
语法格式:strcmp(str1,str2);
功能:比较字符串str1和str2的大小,返回比较的结果。结果为:
0--相等,正数--str1大,负数--str2大
比较原则:按照串中对应位置字符的ASCII码值比较例如:str1 str2
“abc”与“abc”,strcmp(str1,str2)==0 “abcd”与“abck”,strcmp(str1,str2)<0 “abc”与“ab”,strcmp(str1,str2)>0 “abc”与“b”,strcmp(str1,str2)<037字符串比较函数字符串比较函数38【例】验证用户输入的用户名及密码是否正确#include<stdio.h>#include<string.h>voidmain(){ charname[15],pwd[15]; charsname[]="System",spwd[]="123456"; intlogin=0; printf("\n请输入用户名:"); gets(name); printf("\n请输入密码:"); gets(pwd); if((strcmp(name,
sname)==0)&&(strcmp(pwd,spwd)==0)) login=1; if(login)printf("\n您已成功登录!\n"); else printf("\n用户名和/或密码无效!\n");}请输入用户名:System请输入密码:123456
您已成功登录!name==sname?字符串不能用关系运算符比较大小,必须借助strcmp!38【例】验证用户输入的用户名及密码是否正确#include39字符串连接函数字符串连接函数
语法格式:strcat(dest,src);
功能:连接两个字符数组中的字符串,将src串接在dest串后,结果存放在字符数组dest中,函数调用后返回的是字符数组dest的首地址。
字符数组dest的长度不可缺省,应足够大。目标数组名源数组名#include<stdio.h>#include<string.h>intmain(void){ charsource_string[]="UPC"; chartarget_string[30]="Hello";
strcat(target_string,source_string); printf("\n源字符串=%s",source_string); printf("\n目标字符串=%s\n",target_string);}源字符串=UPC目标字符串=HelloUPC39字符串连接函数字符串连接函数目标数组名源数组名#inclstrcat(str2,str1);str2必须足够大!Hello\0\0\0\0\0\0
\0
China\0HelloChina\0
\0strcat(str2,str1);str2必须足够大!H【例10.4】按奥运会参赛国国名在字典中的顺序(由小到大)对其入场次序进行排序【例10.4】按奥运会参赛国国名在字典中的顺序(由小到大c语言课件《字符串》解读c语言课件《字符串》解读#include<stdio.h>#include<string.h>intmain(void){ charsource_string[]="UPC"; chartarget_string[30]="Hello";
strncat(target_string,source_string,2); printf("\n源字符串=%s",source_string); printf("\n目标字符串=%s\n",target_string);}#include<stdio.h>10.6向函数传递字符串向函数传递字符串时,既可使用字符数组作函数参数,也可使用字符指针作函数参数
传地址调用例10.5:字符串复制—将字符串a复制到串b中,再输出串b。要求不能使用strcpy()10.6向函数传递字符串向函数传递字符串时,既可使用字符数组#include<stdio.h>#defineN80voidMyStrcpy(chardstStr[],charsrcStr[]);intmain(){ chara[N],b[N]; printf("Inputastring:"); gets(a);/*输入字符串*/
MyStrcpy(b,a);/*将字符数组a中的字符串拷贝到b中*/ printf("Thecopyis:"); puts(b);/*输出复制后的字符串*/ return0;}#include<stdio.h>voidMyStrcpy(chardstStr[],charsrcStr[]){
inti=0;
while(srcStr[i]!='\0') { dstStr[i]=srcStr[i]; i++; } dstStr[i]='\0';}HelloChina\0
srcStr[i]dstStr[i]Hi=0ei=1li=2li=3oi=4i=5Ci=6hi=7ii=8ni=9ai=10\0srcStr[i]=='\0voidMyStrcpy(chardstStr[],voidMyStrcpy(char*dstStr,char*srcStr){
while(*srcStr!='\0') { *dstStr=*srcStr; srcStr++; dstStr++; } *dstStr='\0';}例10.5:字符串复制—用字符指针编程HelloChina\0
*srcStr*dstStrHelloChina\0*srcStr=='\0srcStr++srcStrdstStr++dstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrvoidMyStrcpy(char*dstStr,c#include<stdio.h>unsignedintMyStrlen(charstr[]);intmain(){ chara[80]; unsignedintlen; printf("Pleaseenterastring:"); gets(a);
len=MyStrlen(a);/*计算字符串实际字符个数*/ printf("Thelengthofthestringis:%u\n",len); return0;}例10.6:计算实际字符个数(不使用strlen()函数)#include<stdio.h>例10.6:计算实际unsignedintMyStrlen(charstr[]){
inti;
unsignedintlen=0;
for(i=0;str[i]!='\0';i++) { len++; }
return(len);}unsignedintMyStrlen(char*pStr){
unsignedintlen=0;
for(;*pStr!='\0';pStr++) { len++; }
return(len);}方法2:用字符指针实现方法1:用字符数组实现统计实际字符个数
(不含'\0')unsignedintMyStrlen(charst将字符串倒置后再打印出来。对于存放了字符串的字符数组,倒置仅仅是对结束符前的字符进行的apple\0字符数组selppa\0字符数组s(a)倒置前(b)倒置后【例】51将字符串倒置后再打印出来。对于存放了字符串的字符数组,倒置仅方法1:使用数组#include<stdio.h>voidmain(){ charstrTemp[256],ch; inti,j; printf("输入一串字符:"); gets(strTemp); i=j=0; while(strTemp[j]!=‘\0’)j++;/*得到\0的下标*/
j--; while(i<j) { ch=strTemp[j]; strTemp[j]=strTemp[i]; strTemp[i]=ch; i++; j--; } printf("倒置后为:%s\n",strTemp);}方法2:使用指针#include<stdio.h>voidmain(){ charstrTemp[256],ch; char*p1,*p2; printf("输入一串字符:"); gets(strTemp); p2=p1=strTemp; while(*p2!='\0')p2++;
p2--; while(p1<p2) { ch=*p1; *p1=*p2; *p2=ch; p1++; p2--; } printf("倒置后为:%s\n",strTemp);}52方法1:使用数组方法2:使用指针52函数指针(FunctionPointers)就是指向函数的指针(PointertoaFunction)指向函数的指针变量存储的是函数在内存中的入口地址
编译器将不带()的函数名解释为该函数的入口地址
函数指针形式为:数据类型(*指针名)(参数列表);例如:int(*p)(int,int);定义p是一个指向函数的指针变量,它指向函数的类型为整型且有两个整型参数的函数。p的类型用int(*)(int,int)表示。10.7从函数返回字符指针回顾第9章的函数指针:函数指针(FunctionPointers)就是指向函数的常见写法错误:忘记了前一个(),写成int*p();/*声明一个函数名为p、返回值是整型指针的函数*/忘掉了后一个(),写成int(*p);
/*定义了一个整型指针*/定义时后一个括号内的参数类型与指向的函数参数类型不匹配常见写法错误:常用的字符串处理函数都是有返回值的,例如:字符串复制函数
语法格式:strcpy(dest,src);字符串连接函数
语法格式:strcat(dest,src);二者的原型:char*strcpy(char*str1,constchar*str2);char*strcat(char*str1,constchar*str2);返回值都是字符串str1的内存空间的首地址(字符指针str1的值)。常用的字符串处理函数都是有返回值的,例如:字符串复制函数增加灵活性,方便级联操作:strcat(str1,"helloChina");len=strlen(str1);len=strlen(strcat(tr1,"HelloChina");MyStrcat(str1,str2);printf(“%s”,str1);printf(“%s”,MyStrcat(str1,str2));增加灵活性,方便级联操作:【例10.7】编程实现strcat()的功能【例10.7】编程实现strcat()的功能c语言课件《字符串》解读返回字符串首地址返回字符串首地址const类型限定符const是一个C语言的关键字,它限定一个变量不允许被改变。三种基本应用:一.应用在变量constchara='A';a='B';
//错误,变量a的值不可以修改。此时代表变量a值不可改变,任何企图修改a变量值的语句都会报错。const类型限定符const是一个C语言的关键字,它限定二.应用在指针
1)应用在*左边
constchar*p;
charconst*p;
以上两条语句作用一样,都是表示指针指向的变量值(即:*p)不可以修改,但指针p可以修改。
例如:
constchar*p=&a;
char*q=&b;
*p=b;
//错,指针指向的值不可以修改。
p=q;
//对,指针值可以修改二.应用在指针
2)应用在*右边
char*constp;
表示指针值(p)不可以改变,但指针指向的值(*p)可以改变。
例如:
char*constp=&a;
char*q=&b;
*p='b';
//对,指针指向的值可以修改。
p=q;
//错误,指针值不可以修改。对于:constchar*constp=&a;p和*p都不可以修改。
2)应用在*右边字符处理函数#include<ctype.h>intisdigit(intc)测试C是否为十进制数字(是:返回值为真(非零))intisalpha(intc)测试C是否为字母intisalnum(intc)测试C是否为字母或数字intislower(intc)测试C是否为小写字母intisupper(intc)测试C是否为大写字母inttolower(intc)将字符C转换成小写字符inttoupper(intc)将字符C转换成大写字符intisspace(intc)测试C是否为空白intiscsym(intc)测试C是否为字母、下划线或数字intiscntrl(intc)测试C是否为控制字符intispunct(intc)测试C是否为标点符号intisgraph(intc)测试C是否为可打印字符intisprint(intc)判断C是否为可打印字符字符处理函数#include<ctype.h>【例10.8】输入一行字符,统计其中的英文字符、数字字符、空格和其它字符的个数。#include<stdio.h>#defineN80intmain(){ charstr[N]; inti,letter=0,digit=0,space=0,others=0; printf("Inputastring:"); gets(str);
for(i=0;str[i]!='\0';i++) { if(str[i]>='a'&&str[i]<='z'||str[i]>='A'&&str[i]<='Z') letter++; /*统计英文字符*/ elseif(str[i]>='0'&&str[i]<='9') digit++; /*统计数字字符*/ elseif(str[i]=='') space++; /*统计空格*/ else others++; /*统计其他字符*/}
不用字符处理函数实现【例10.8】输入一行字符,统计其中的英文字符、数字字符、空printf("Englishcharacter:%d\n",letter); printf("digitcharacter:%d\n",digit); printf("space:%d\n",space); printf("othercharacter:%d\n",others); return0;}printf("Englishcharacter:%d\用字符处理函数实现
#include<stdio.h>#defineN80intmain(){ charstr[N]; inti,letter=0,digit=0,space=0,others=0; printf("Inputastring:"); gets(str);
for(i=0;str[i]!='\0';i++) { if(isalpha(str[i])) letter++; /*统计英文字符*/ elseif(isdigit(str[i])) digit++; /*统计数字字符*/ elseif(isspace(str[i])) space++; /*统计空格*/ else others++; /*统计其他字符*/}
用字符处理函数实现【例10.9】输入一个人的名和姓,然后将名和姓的第一个字幕都变成大写字母。
#include<stdio.h>#include<ctype.h>#defineN80intmain(){ charname[N]; inti; printf("Inputaname:"); gets(name);/*输入名和姓*/name[0]=toupper(name[0]);/*名的首字母变大写*/ i=1;while(!isspace(name[i]))/*跳过所有字母,直到遇空格为止*/ { i++; }
【例10.9】输入一个人的名和姓,然后将名和姓的第一个字幕都while(!isalpha(name[i]))/*跳过所有空格,遇到字母为止*/ { i++; }name[i]=toupper(name[i]);/*将名的首字母变为大写*/ printf("FormattedName:%s\n",name); return0;}while(!isalpha(name[i]))/*跳过【例10.9】输入一个人的名和姓,然后将名和姓的第一个字幕都变成大写字母。
#include<stdio.h>#include<ctype.h>#defineN80intmain(){ charname[N]; inti; printf("Inputaname:"); gets(name);/*输入名和姓*/ i=0;
while(!isalpha(name[i]))/*跳过所有空格,遇到字母为止*/ { i++; }【例10.9】输入一个人的名和姓,然后将名和姓的第一个字幕都name[i]=toupper(name[i]);/*将名的首字母变为大写*/while(!isspace(name[i]))/*跳过所有字母,直到遇空格为止*/ { i++; }while(!isalpha(name[i]))/*跳过所有空格,直到遇字母为止*/ { i++; } name[i]=toupper(name[i]);/*将姓的首字母变为大写*/ printf("FormattedName:%s\n",name); return0;}name[i]=toupper(name[i]);/*习题:1、填空1)计算指针p所指向的字符串的长度unsignedintMyStrlen(char*p){unsignedintlen;for(;*p!=;p++){len;}return;}习题:2)计算字符数组s中字符串长度。方法与1)不同
unsignedintMyStrlen(chars[]){char*p=s;while(*p!=
){p++;}/*移动指针使其指向结束标志*/return
;/*返回指针p与字符串首地址
之间的差值*/}2)计算字符数组s中字符串长度。方法与1)不同unsign3)比较两字符串大小,将字符串中第1个出现的不相同字符的ASCII码值之差作为比较结果返回。若第1个字符串大于(小于)第2个字符串,返回正值(负值);相同,则返回0。intMyStrcmp(char*p1,char*p2){for(;*p1==*p2;p1++,p2++){if(*p1==‘\0’)return
;}return
;}3)比较两字符串大小,将字符串中第1个出现的不相同字符的AS4)同样实现比较功能,与3)不同。intMyStrcmp(chars[],chart[]){inti;for(i=0;s[i]==t[i];i++){if(s[i]==
)return0;}return
;}4)同样实现比较功能,与3)不同。intMyStrcm5)比较用户输入口令userInput与系统内设口令password是否相同。#include“stdio.h”#include“string.h”intmain(){charpassword[7]=“secret”;charuserInput[81];printf(“InputPassword:”);scanf(“%s”,userInput);if(
)printf(“Correctpassword!\n”);elseif(
)printf(“Invalidpassword!userinput<password\n”);elseprintf(“Invalidpassword!userinput>password\n”);return0;}5)比较用户输入口令userInput与系统内设口令pas2.输入一行字符,统计其中有多少个单词。假设单词之间以空格分开。
提示:当前字符不是空格,而前一个字符是空格,则表示有新单词出现。#include<stdio.h>intCountWord(charstr[]);intmain(){charstr[20];printf(“inputastring:”);gets(str);printf(“number=%d\n”,CountWords(str));return0;}intCountWord(charstr[]){inti,num;num=(str[0]!=‘’?1:0);for(i=1;str[i]!=‘\0’;i++){……}returnnum;}写出循环体部分2.输入一行字符,统计其中有多少个单词。假设单词之间以空格3.分别用字符数组和字符指针作函数参数两种方法实现:在字符串中删除与某字符相同的字符。3.分别用字符数组和字符指针作函数参数两种方法实现:在字符串1)字符数组作函数参数2)字符指针作函数参数#include<stdio.h>voidSqueeze(chars[],charc);intmain(){charstr[20],ch;printf(“Inputastring:”);gets(str);printf(“Inputacharacter:”);ch=getchar();Squeeze(str,ch);printf(“Results:%s\n”,str);return0;}voidSqueeze(chars[],charc){inti,j;for(i=j=0;s[i]!=‘\0’;i++){if(s[i]!=c){s[j]=s[i];j++}}s[j]=‘\0’;/*末尾添加结束标志*/}#include<stdio.h>voidSqueeze(char*s,charc);intmain(){charstr[20],ch;printf(“Inputastring:”);gets(str);printf(“Inputacharacter:”);ch=getchar();Squeeze(str,ch);printf(“Results:%s\n”,str);return0;}写出函数剩余部分voidSqueeze(char*s,charc){char*t1=s;*t2=s;1)字符数组作函数参数2)字第10章字符串第10章字符串本章学习内容字符串常量字符串处理函数字符数组和字符指针向函数传递字符串从函数返回一个字符串指针本章学习内容字符串常量10.1字符串常量用双引号括起的一串字符是字符串常量,C语言自动为其添加'\0'结束符"Howareyou"一串以‘\0’结尾的字符序列在C语言中被看作字符串。ASCII码值为010.1字符串常量用双引号括起的一串字符是字符串常量,C语言82字符串的存储在内存中连续存储,以字符’\0’为结束标识C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串,使用字符数组或字符指针来处理字符串HelloWorld\010.2字符串的存储4HelloWorld\010.2字符串的存储说明:’\0’代表ASCII码为0的字符,从ASCII码表中可以查到,ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不做。用它来作为字符串结束标志不会产生附加的操作或增加有效字符,只是一个供辨别的标识。83说明:584字符数组字符数组每个元素都是字符类型的数组。它的每个元素存放一个字符(占一个字节)字符数组的定义如charc[10];数组c是一维数组,它可以存放10个字符,或者一个长度不大于9的字符串如charname[3][10];数组c是二维数组,它可以存放30个字符,或者3个长度不大于9的字符串注意:字符串只能存放在字符数组中6字符数组字符数组85一维字符数组的初始化用字符常量赋值 如:charc[5]={'C','h','i','n','a'};又如:
charc[6]={'C','h','i','n','a','\0'};再如:charc[7]={'C','h','i','n','a'};ChinaChina\0不是字符串是字符串China\0\07一维字符数组的初始化用字符常量赋值ChinaChina\086用字符的ASCII码赋值如:charc[6]={67,104,105,110,97,0};用字符串常量赋值
如:charc[6]={“China”};或者charc[6]=“China”;China\0是字符串
注:以字符串方式赋值时,必须保证数组元素个数≥字符个数+1,(字符串后面需自动加上一个'\0')。China\08用字符的ASCII码赋值China\0是字符串注:以字符87一维字符数组的初始化省略数组长度
如:charc[]={'C','h','i','n','a'};再如:
charc[]=“China”;注意:不可以为数组单独整体赋值,例如
charstr[10];str=“China”;ChinaChina\0是字符数组,但不代表字符串是字符串×9一维字符数组的初始化省略数组长度
ChinaChina\010.3字符指针HelloChina\0字符指针就是指向字符类型数据的指针"HelloChina"pStr10.3字符指针Hel89字符指针是指向字符型数据的指针,定义为:
char*指针;
可以用字符数组首地址为指针赋初值
chara[]="WelcometoBeijing."; char*p=a;//对于一维数组,数组名代表首地址
也可以用字符串常量为指针赋初值
char*p=“Hello”;//字符串常量本身代表首地址对p初始化,即使p指向字符串的第一个字符。11字符指针是指向字符型数据的指针,定义为:
由于p为指针变量,指针指向是可以改变的
char*p="Hello",*q=p; p="world";90由于p为指针变量,指针指向是可以改变的1291字符数组与字符指针变量比较:1、charstr[20]=“china”;
与char*p=“china”;2、str数组由20个元素组成;而p中存放字符串首地址3、charstr[20];str=“IloveChina!”;(X)char*p;p=“IloveChina!”;()4、str是地址常量;p是指针变量13字符数组与字符指针变量比较:92字符数组元素的访问可以为数组元素赋值,也输出元素的值【例】对字符数组c1赋值’0’~’9’,对字符数组c2赋值’A’~’Z’,然后输出c1和c2中的数据#include<stdio.h>voidmain(){charc1[10],c2[26];inti; for(i=0;i<10;i++)c1[i]=i+48;
for(i=0;i<26;i++)c2[i]=i+'A';
for(i=0;i<10;i++)printf("%c",c1[i]);printf("\n");
for(i=0;i<26;i++)printf("%c",c2[i]);
printf("\n");}10.4字符串的访问和输入/输出14字符数组元素的访问可以为数组元素赋值,也输出元素的值#i93字符串的输入和输出C语言中常用的字符串输入输出函数有scanf和printf、gets和puts等1、printf函数一般格式为:
printf("%s",字符数组名或字符串常量)
其中,%s为字符串格式符 例如:
charc[15]=“HelloChina!";printf("%s",c);printf(“%s”,“HelloChina!");注意:用格式%s控制输出
1.输出项一定要是地址
2.遇到‘\0’便结束输出15字符串的输入和输出C语言中常用的字符串输入输出函数有sc942、scanf函数一般格式为:
scanf(“%s”,字符数组名)
其中,%s为字符串描述符,对应的输入项是字符数组的首地址 例如:
charc[10];scanf("%s",c);注意:scanf接收数据的变量要求的是地址:
对变量(数组元素),前面才加&
对一维数组,数组名就是数组的首地址
不能加“&”162、scanf函数注意:scanf接收数据的变量要求的【例10.1】从键盘输入一个人名,把它显示在屏幕上Why?scanf函数使用空白(空格、制表符、回车符等)作为输入数据的分隔符,所以只能获取“单词”【例10.1】从键盘输入一个人名,把它显示在屏幕上Why?【例10.1】从键盘输入一个人名,把它显示在屏幕上【例10.1】从键盘输入一个人名,把它显示在屏幕上973、字符串输入函数gets()
调用格式:gets(字符数组名)
功能:从键盘输入一个字符串(以回车结束)存入字符数组中,用空字符’\0’行尾。4、字符串输出函数puts()
调用格式:puts(字符数组名或字符串常量本身)
功能:输出一个字符串,输出后自动换行
即puts(str)与printf("%s\n",str)等价使用gets()函数允许在字符串中输入空格193、字符串输入函数gets()即puts(str)与用puts函数输出的字符串中可以包含转义字符。例如:charstr[]={“China\nBeijing”};puts(str);
输出:ChinaBeijing
在输出完字符后自动换行。98用puts和gets函数只能输出或输入一个字符串,不能写成puts(str1,str2)
或gets(str1,str2)用puts函数输出的字符串中可以包含转义字符。例如:20用p99#include<stdio.h>voidmain(){charstr[15];printf("输入一个字符串:");
gets(str);printf(“\n输入的字符串是:");
puts(str);}字符串的输入和输出使用gets函数允许输入空格输入一个字符串:HelloChina输入的字符串是:Hello
ChinaHelloChina\021#include<stdio.h>字符串的输入和输出使100【例】输入一句话,统计空格的个数#include<stdio.h>voidmain(){charline[80];inti,count;printf("\n请输入一行字符:\n");
gets(line);
i=0,count=0;while(line[i]!='\0')
{if(line[i]=='')count++; i++;}printf("\n其中的空格总数为%d\n",count);}for(i=0,count=0;line[i]!='\0';i++)if(line[i]=='')count++;22【例】输入一句话,统计空格的个数#include<st【例10.2】使用函数gets(),从键盘输入一个带有空格的人名,然后把它显示在屏幕上【例10.2】使用函数gets(),从键盘输入一个带有空格的c语言课件《字符串》解读能够限制输入字符串的长度从标准输入stdin中读取一行长度为sizeof(name)的字符串送到name为首地址的缓冲存储区去能够限制输入字符串的长度从标准输入stdin中读取一行长度为【例10.3】从键盘输入一个带有空格的人名,然后在显示人名的前面显示"Hello",Isaidto【例10.3】从键盘输入一个带有空格的人名,然后在显示人名的【例10.3】从键盘输入一个带有空格的人名,然后在显示人名的前面显示"Hello",Isaidto【例10.3】从键盘输入一个带有空格的人名,然后在显示人名的10.5字符串处理函数10.5字符串处理函数107字符串数组字符串数组是存放了若干字符串的字符数组,是一个二维数组,每个字符串占一行,字符串的个数对应数组的行数;字符串数组的定义为:char数组名[字符串个数][字符串长度]如:charstr[3][20];29字符串数组字符串数组是存放了若干字符串的字符数组,是一个108字符串数组的初始化:chara[3][8]={"str1","str2","string3"};charb[][6]={"s1","st2","str3"};字符串的引用将字符串数组当作一维数组使用,这个一维数组中的每个元素是个一维数组:{a[0],a[1],a[2]}引用二维字符数组的行下标:a[0],a[1],a[2]str1str2\0\0string3\0\0\0\0\0\0\0a[0]a[0][0]a[1]a[2]数组a初始化后的存储情况30字符串数组的初始化:str1str2\0\0string109【例】输入数字星期几(星期天用0表示),输出对应的英文名称分析: 建立如下星期表:用二维字符数组存储星期表,每行存一个字符串Sunday\0Monday\0Tuesday\0Wednesday\0Thursday\0Friday\0Saturday\001234560123456789\0\0\0\0\0\0\0\0\0\0\0\0\0SundayMondayTuesdayWednesdayThursdayFridaySaturday012345631【例】输入数字星期几(星期天用0表示),输出对应的英文名110#include<stdio.h>voidmain(){charw_day[][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
intnum;printf("Enteranumber(0~6):");scanf("%d",&num);if(num>=0&&num<=6)printf("%d:%s\n",num,w_day[num]);elseprintf("Errornumber!\n");}do{printf("Enteranumber(0~6):");scanf("%d",&num);}while(num<0
||num>6);32#include<stdio.h>do111字符串处理函数与字符串有关的函数在头文件string.h中定义要使用标准库字符串处理函数,程序前应该包含:
#include<string.h>string.hstrlenstrcpystrcmpstrcat……33字符串处理函数与字符串有关的函数在头文件string.h112字符串的长度字符串的长度是字符串中位于\0之前的字符的个数根据字符串中
\0的位置来计算字符串长度。 若:数组中下标为i
的元素为\0,则,串长=
i。例:求字符串的长度#include<stdio.h>voidmain(){ intlength=0; charstr[30];printf("InputaString:");gets(str);
while(
str[length]!='\0'
)
length++; printf("\nStringlengthis%d\n",length);}abcdefg\0串长length=7length=0length=1length=234字符串的长度字符串的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 单位来人住宿管理制度
- 网络流量监控与分析题目及答案
- 口岸信用评价管理制度
- 免疫相关毒性管理制度
- 公司票据报销管理制度
- 嵌入式开发的敏捷方法试题及答案
- 数据通信协议的关键点试题及答案
- 卡车物流日常管理制度
- 医院咨询投诉管理制度
- 宿舍消防安全管理制度
- 新疆生产建设兵团2025届七年级数学第二学期期末监测模拟试题含解析
- 《保安员培训手册》
- 农业执法考试试题及答案
- 股权转让解除协议书
- 幼儿园桌椅安全教育
- 《2025 急性心梗诊疗指南》解读课件
- 2025-2031年中国医学检验市场深度分析及行业前景展望报告
- 医院培训课件:《中华人民共和国母婴保健法》
- 佛山市普通高中2025年高三第二次诊断性检测生物试卷含解析
- 道路竣工测量重点基础知识点
- 山东省济宁市任城区2023年中考一模化学试题(含答案)
评论
0/150
提交评论