
程序设计基础 第10章字符串 1/20
程序设计基础 第10章 字符串 1/20

本章内容 ■10.1字符串常量 ■10.2如何表示字符串变量(重点) ■10.3字符串的输入输出 ■10.4字符串处理函数(重点) ■10.5字符指针与字符数组的区别(难点) ■10.6程序举例 2/20
◼10.1 字符串常量 ◼10.2 如何表示字符串变量(重点) ◼10.3 字符串的输入输出 ◼10.4 字符串处理函数(重点) ◼10.5 字符指针与字符数组的区别(难点) ◼10.6 程序举例 本章内容 2/20

字符数组、字符串常量和字苻串结束标志 10.1字符串常量 str[o]str[1]str[2]str[3]str[4] ■字符数组:用来存放字符数据的数组。 c h ◆char str[5l; n a ◆str0=C';str=h';str2=i;str3]=n';str4=a';/先定义,再赋初值 ◆char str10={C',h',i,n',‘a';/定义时初始化 ◆char str=C,h’,i,n',‘a;/默认数组长度为5 ■字符串常量:用双引号括起来的字符序列。 ◆例如:字符串常量“China”在内存中占6个字节,而不是5个字节。 str[o]str[1]str[2]str[3]str[4]str[5] n a 10 ◆C语言规定字符0'为“字符串结束标志”。系统会自动在后面加一个0'。 ◆在程序中往往依靠检测0'的位置来判定字符串是否结束。 ■用字符串常量来初始化字符数组。例如 ◆char str0=China"; ◆char str=“China”;∥默认数组长度是6 ■在语句中不能用字符串给字符数组整体赋值。 ◆char str[12]; ◆str=“China”;l错误,数组名str是常量不可再赋值。 example6_4_string 3/20
◼ 字符数组:用来存放字符数据的数组。 example6_4_string ◆ char str[5]; ◆ str[0]=‘C’; str[1]=‘h ’; str[2] = ‘i’; str[3] = ‘n’; str[4] = ‘a’; //先定义,再赋初值 ◆ char str[10]={‘C’, ‘h’, ‘i’, ‘n’, ‘a’}; //定义时初始化 ◆ char str[]={‘C’, ‘h ’, ‘i’, ‘n’, ‘a’ }; //默认数组长度为5 字符数组、字符串常量和字符串结束标志 ◼ 字符串常量:用双引号括起来的字符序列。 ◆例如: 字符串常量“China”在内存中占6个字节,而不是5个字节。 ◆ C语言规定字符‘\0’为“字符串结束标志”。系统会自动在后面加一个‘\0’ 。 ◆ 在程序中往往依靠检测‘\0’的位置来判定字符串是否结束。 str[0] str[1] str[2] str[3] str[4] str[5] C h i n a \0 ◼ 用字符串常量来初始化字符数组。例如 ◆ char str[]={“China”}; ◆ char str[]=“China”; //默认数组长度是6 str[0] str[1] str[2] str[3] str[4] C h i n a 10.1 字符串常量 ◼在语句中不能用字符串给字符数组整体赋值。 ◆ char str[12]; ◆ str=“China”; //错误,数组名str是常量不可再赋值。 3/20

讨论1:字符数组最后一个号是否必须为0 ■char str={“China"; ■char str=“China'"; h n a 0 ■char str0=℃',h',i',n',a',0; ■char str[7]☑={C',h',i',n',‘a: h n 0 10 字符数组并不要求它的最后一个字符为10',甚至可以不包含0' 好习惯:在字符数组有效字符的后面人为地加0 char str[6]=℃',h',i,n',a',0'y 讨论2:如何用字符数组存放多个姓名 ■二维字符数组char str[2][20]={Nang Fei'”,“Xie Tingfeng"; 0 3 5 6 8 9 10 11 12 ■■■ 19 0 W a g 10 10 10 10 10 10 e n 9 10 10 10 4/20
讨论1:字符数组最后一个符号是否必须为‘\0’ ◼char str[]={“China”}; ◼char str[]=“China”; ◼char str[]={‘C’, ‘h ’, ‘i’, ‘n’, ‘a ’, ‘\0’}; C h i n a \0 C h i n a \0 \0 ◼ char str[7]={‘C’, ‘h’, ‘i’, ‘n’, ‘a’}; 字符数组并不要求它的最后一个字符为‘\0’ ,甚至可以不包含‘\0’ 好习惯:在字符数组有效字符的后面人为地加‘\0’ char str[6]={‘C’, ‘h ’, ‘i’, ‘n’, ‘a ’, ‘\0’} ◼二维字符数组 char str[2][20]={“Wang Fei”, “Xie Tingfeng”}; 0 1 2 3 4 5 6 7 8 9 10 11 12 . 19 0 W a n g F e i \0 \0 \0 \0 \0 \0 . \0 1 X i e T i n g f e n g \0 \0 . \0 讨论2:如何用字符数组存放多个姓名 4/20

字符数组的输入输出 ■输入并输出自已的姓名 数组元素地址 ■逐个字符输入输出(for循环实现): char str[20]; for(=0;K20;it+)scanf(“y%c”,&str[)i for(=0;ik20;it+)printf(o%c”,str[叮)房 空格作为字符读入 ■逐个字符输入输出(while循环实现) char ch,str[20]; i=0; i=0;scanf(%c”,&ch)月 while(str[0)l=o) while(ch !'In') printf("%c",str[i]); str[i]=ch; ++; scanf((%c”,&ch)i } ++; printf(An'); str[i]=10'; example6_4_1 5/20
char str[20]; for(i=0;i<20;i++) scanf(“%c”,&str[i]); for(i=0;i<20;i++) printf(“%c”,str[i]); 字符数组的输入输出 ◼输入并输出自己的姓名 ◼逐个字符输入输出(for循环实现): ◼逐个字符输入输出(while循环实现) example6_4_1 数组元素地址 空格作为字符读入 char ch, str[20]; i=0; scanf(“%c”, &ch); while(ch != ‘\n’) { str[i] = ch; scanf(“%c”, &ch); i++; } str[i] = ‘\0’; i=0; while(str[i])!=‘\0’) { printf(“%c”,str[i]); i++; } printf(‘\n’); 5/20

整个字符数组输入 查函数手册gets函数 char s[10]; ·gets函数 while(get(s)!=NULL)while(get(s)) 格式:gets(字符数组) I∥应包含的.h文件为stdio.h 功能:以回车结束的字符串放入字苻数组中,并自动加八0? 例:char str8O;gets(str); 当输入:Ilovechina!e(o表示空格,e表示回车)时, str中的字符串将是:"I love china!" ● scanfi函数 格式:scanf("%s",字符数组)∥应包含的.h文件为stdio.h 功能:以空格或回车结束的字符串放入字符数组中,并自动加八0? 例:char str1[40,str240],str340; scanf("%s%s%s",strl,str2,str3); 输入:口口I□love口china!e str1:"I",str2:"love",str3:"china!" 例:使用%s格式控制符限制输入的字符个数。 char str[10]; scanf("%9s",str);/最多可读入9个非空格字符到str中 6/20
整个字符数组输入 格式:gets(字符数组) //应包含的.h文件为stdio.h 功能:以回车结束的字符串放入字符数组中,并自动加'\0’ 例:char str[80]; gets (str); 当输入:I□love□china!↙(□表示空格,↙表示回车)时, str中的字符串将是:"I love china!" ⚫ gets函数 ⚫ scanf函数 格式:scanf("%s" , 字符数组) //应包含的.h文件为stdio.h 功能:以空格或回车结束的字符串放入字符数组中,并自动加'\0’ 查函数手册 gets函数 char s[10]; while(get(s)!=NULL) 或 while(get(s)) 例:char str1[40], str2[40], str3[40]; scanf ("%s%s%s", str1, str2, str3); 输入:□□I□love□china!↙ str1:"I",str2:"love",str3:"china!” 例:使用%ns格式控制符 限制输入的字符个数。 char str[10]; scanf ("%9s", str); //最多可读入9个非空格字符到str中 6/20

puts函数 整个字符数组输出 格式:puts(字符串地址) ∥应包含的.h文件为stdio.h 功能:向显示器输出字待串(输出完,换行) 说明:如果是字符数组,则必须以八0'结束 例:char str[]="I love china!"; 输出结果: puts(str); I love china! puts ("I love Zibo!") I love Zibo! printf函数 格式:printf("%s",字符串地址)/∥应包含的.h文件为stdio.h 功能:依次输出字符串中的每个字苻直到遇到宇符小0?(八0'不会被输出) 例:char name="John Smith"; 输出结果: printf ("The name is:%s\n",name); The name is:John Smith printf("Last name is:%s\n",&name[51); Last name is:Smith printf ("First name is:%s\n","John"); First name is:John 恩 7/20
格式:puts(字符串地址) //应包含的.h文件为stdio.h 功能:向显示器输出字符串(输出完,换行) 说明:如果是字符数组,则必须以'\0'结束 ⚫ puts函数 例:char str[ ] = "I love china! "; puts (str); puts ("I love Zibo! "); 输出结果: I love china! I love Zibo! ⚫ printf函数 格式:printf("%s" , 字符串地址) //应包含的.h文件为stdio.h 功能:依次输出字符串中的每个字符直到遇到字符‘\0’('\0'不会被输出) 例:char name[ ] = "John Smith"; printf ("The name is: %s\n", name); printf ("Last name is: %s\n", &name[5]); printf ("First name is: %s\n", "John"); 输出结果: The name is: John Smith Last name is: Smith First name is: John 整个字符数组输出 7/20

字符数组应用举例 输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。 解题思路:问题的关键是怎样确定“出现一个新单词了” 逐个检查字符ch,判断ch是否是新单词的开头。 判断是否出现新单词,由是否有空格出现来决定,word=O,word=1 如果某一个字符ch=空格,而它前面字符是空格word==0,则表示 “新的单词开始了”,此时使num累加1。 如果当前字符为chl=空格而其前面字符也是非空格word=1,则num 不再累加1。 当前字符 I a m a b 0 y 是否空格 否 是否 否 是 否 是 否 否 否否 word原值 0 1 0 1 1 0 1 0 1 1 1 新单词开始否 是 否是 否 否 是 否 是 否 否 否 word新值 0 0 1 num值 2 4 4 4 8/20
输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。 解题思路:问题的关键是怎样确定“出现一个新单词了” – 逐个检查字符 ch,判断ch是否是新单词的开头 。 – 判断是否出现新单词,由是否有空格出现来决定,word=0,word=1 – 如果某一个字符ch!=空格,而它前面字符是空格word==0,则表示 “新的单词开始了”,此时使num累加1。 – 如果当前字符为ch!=空格而其前面字符也是非空格word==1,则num 不再累加1。 字符数组应用举例 当前字符 I a m a b o y . 是否空格 否 是 否 否 是 否 是 否 否 否 否 word原值 0 1 0 1 1 0 1 0 1 1 1 新单词开始否 是 否 是 否 否 是 否 是 否 否 否 word新值 1 0 1 1 0 1 0 1 1 1 1 num值 1 1 2 2 2 3 3 4 4 4 4 8/20

字符数组应用举例 if(c=='word=0; else if(word==0) word=1; num++; c==空格 N word=0 用变量word作为判别当 N 前是否开始了一个新单词 word==0 的标志,若word=O表示 Y 未出现新单词,如出现了 新单词,就把word置成1 word=1 num++ 。1 前面一个字符是否空格可 以从word的值看出来, 若word等于0,则表示前 一个字符是空格;如果 word等于1,意味着前一 个字符为非空格 恩 9/20
Y c==空格 N word=0 word==0 Y word=1 num++ N if(c==' ') word=0; else if(word==0) { word=1; num++; } • 用变量word作为判别当 前是否开始了一个新单词 的标志,若word=0表示 未出现新单词,如出现了 新单词,就把word置成1 • 前面一个字符是否空格可 以从word的值看出来, 若word等于0,则表示前 一个字符是空格;如果 word等于1,意味着前一 个字符为非空格 字符数组应用举例 9/20

char string[81],c;int i,num=0,word=0; gets(string); for (i=0;(c=string[i])!=10';i++) 定要设初始值 if(c==')word=0; else if(word==0) word=1; num++; printf("%d wordsIn",num); 0aan。· 恩 10/20
. char string[81],c; int i,num=0,word=0; gets(string); for (i=0;(c=string[i])!=‘\0’;i++) if(c==‘ ’) word=0; else if(word==0) { word=1; num++; } printf(“%d words\n”,num); . 一定要设初始值 10/20