第第8 8章章 字符串处理字符串处理主讲教师:郑立垠主讲教师:郑立垠计算机与通信工程学院计算机与通信工程学院 计算机应用技术系计算机应用技术系本章主要内容1、字符数组与字符串的概念2、字符串输入/输出函数3、字符串处理函数字符串的概念p字符串:若干字符的组合看作一个整体,称为字符串p字符串常量:用双引号“ ”括起的字符序列p字符串的存储p在内存中连续存储,以字符‘\0’为结束标识pC语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串,使用字符数组或字符指针来处理字符串HelloWorld\0“China University of Petroleum"“Hello World "printf(" Input a number: \n “ )定界符定界符ASCII码值为码值为0字符数组p字符数组每个元素都是字符类型的数组,它的每个元素存放一个字符(占一个字节)p字符数组的定义如 char c[10];数组c是一维数组,它可以存放10个字符,或者一个长度不大于9的字符串如 char name[3][10];数组c是二维数组,它可以存放30个字符,或者3个长度不大于9的字符串注意:字符串只能存放在数组中一维字符数组的初始化l用字符常量赋值如: char c[5]={'C', 'h', 'i', 'n', 'a'};又如:char c[6]={'C', 'h', 'i', 'n', 'a', '\0'};再如:char c[7]={'C','h','i','n','a'};ChinaChina\0不是字符串不是字符串是字符是字符串串China\0\0表示空字符表示空字符NULL一维字符数组的初始化l用字符串常量赋值如: char c[6]={”China”};或者char c[6]=”China”;China\0是字符是字符串串 注注::以以字字符符串串方方式式赋赋值值时时,,必必须须保保证证数数组组元元素素个个数数≥字字符个数符个数+1,(字符串后面自动加上一个(字符串后面自动加上一个'\0')。
一维字符数组的初始化l省略数组长度如: char c[ ]={'C', 'h', 'i', 'n', 'a'};再如:char c[ ]=”China”;注意:不可以为数组单独整体赋值,例如char str[10]; str=”China”; ChinaChina\0不是字符串不是字符串是字符是字符串串×字符数组元素的引用可以为数组元素赋值,也可以输入/输出元素的值【例】对字符数组c1赋值’0’~’9’,对字符数组c2赋值’A’~’Z’,然后输出c1和c2中的数据//chap8ex1.c#include int main (){ char c1[10], c2[26]; int i; 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"); return 0;}字符串的输入和输出C语言中常用的字符串输入输出函数有语言中常用的字符串输入输出函数有scanf和和printf、、gets和和puts等等1、printf函数一般格式为::printf("%s", 字符数组名或字符串常量)其中,%s为字符串描述符例如: char c[15]=“Hello China!\n"; printf("%s", c); printf("%s","Hello China!\n");注意注意:用格式:用格式%s%s控制输出控制输出 1. 1. 输出项一定要是地址输出项一定要是地址 2. 2. 遇到遇到‘\0\0’’便结束输出便结束输出字符串的输入和输出2、scanf函数一般格式为::scanf("%s", 字符数组)其中,%s为字符串描述符,对应的输入项是字符数组的首地址例如: char c[10]; scanf("%s", c); 注意注意::scanfscanf 接收数据的变量要求的是接收数据的变量要求的是地址地址: : 对简单变量对简单变量( (数组元素数组元素) ),前面加,前面加& & 对一维数组,对一维数组,数组名数组名就是数组的首地址就是数组的首地址 对二维数组,只写对二维数组,只写行下标行下标是本行首地址是本行首地址无需加无需加“&”字符串的输入和输出示例//chap8ex2.c#includeint main( ){char s1[15];char s2[ ]={'L','i',' ','s','i','\0'};char s3[ ]="Wang wu";int i=0;printf("请向数组中输入一个姓名:请向数组中输入一个姓名:");scanf("%s",s1);printf(" 第一个字符串是:第一个字符串是:");while( s1[i]!='\0' ){printf("%c",s1[i]);i++;}printf("\n 第二个字符串是:第二个字符串是:");printf("%s",s2);printf("\n 第三个字符串是:第三个字符串是:");printf("%s\n",s3);return 0;}#include int main (){ char str[20]; printf("输入一个字符串:输入一个字符串:"); scanf("%s",str); printf("输入的字符串为:输入的字符串为:%s",str); printf("\n"); return 0; }字符串的输入和输出输入一个字符串:输入一个字符串:Hello使用使用 scanfscanf 时,不时,不能输入空格能输入空格输入的字符串为:输入的字符串为:Hello输入一个字符串:输入一个字符串:Hello China输入的字符串为:输入的字符串为:Hellouscanfscanf函数使用空白(空格、制表符、回车符等)函数使用空白(空格、制表符、回车符等)作为输入数据的分隔符,所以只能获取作为输入数据的分隔符,所以只能获取“单词单词”uscanfscanf函数只能输入不包括空格、函数只能输入不包括空格、\t\t和和\n\n的字符串的字符串字符串的输入和输出3、字符串输入函数gets( )调用格式::gets(字符数组)功能:从键盘输入一个字符串(以回车结束以回车结束)存入字符数组中,用空字符‘\0’取代行尾的换行符‘\n‘,并返回一个函数值,该函数值是字符数组的首地址。
4、字符串输出函数puts( )调用格式::puts(字符数组或字符串常量)功能:输出一个字符串,输出后自动换行 即即 puts(str)与与 printf("%s\n", str)等价等价使用使用gets()函数允许在字符串中输入空格函数允许在字符串中输入空格#include int main (){ char str[15]; printf("输入一个字符串:输入一个字符串:"); gets(str); printf(“输入的字符串是:输入的字符串是:"); puts(str); return 0;}字符串的输入和输出使用使用 gets函数允函数允许许输入空格输入空格输入一个字符串:输入一个字符串:Hello China输入的字符串是:输入的字符串是:Hello ChinaHelloChina\0字符串示例【例】输入一句话,统计空格的个数#include int main (){ char line[80]; int i, count; printf("请输入一行字符请输入一行字符:"); gets(line); i=0;count = 0; while(line[i] !='\0') { if(line[i] ==' ') count++; i++; } printf("\n 其中的空格总数为其中的空格总数为 %d \n ", count); return 0;}for(i=0, count = 0; line[i] !='\0'; i++) if(line[i] ==' ') count++;字符串数组p字符串数组是存放了若干字符串的字符数组,是一个二维数组,每个字符串占一行,字符串的个数对应数组的行数。
p字符串数组的定义为:char 数组名[字符串个数][字符串长度]如: char str[3][20];p可将字符串数组当作一维数组使用,这个一维数组中的每个元素是一个字符串字符串数组Ø字符串数组的初始化:Øchar a[3][8]={"str1","str2","string3"};Øchar b[ ][6]={"s1","st2","str3"};Ø字符串的引用q将字符串数组当作一维数组使用,这个一维数组中的每个元素是个一维数组: {a[0],a[1],a[2]}q引用二维字符数组的行下标: 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初始化后的存储情况初始化后的存储情况字符串数组示例【例】输入数字星期几(星期天用0表示),输出对应的英文名称分析:建立如下星期表:用二维字符数组存储星期表,每行存一个字符串S u n day \0M o n day \0T uesday \0W ed nesday \0T h ursday \0Friday \0S aturday \001234560123456789SundayMondayTuesdayWednesdayThursdayFridaySaturday0123456字符串数组示例//chap8ex3.c#include int main (){ char w_day[ ][10]={"Sunday","Monday", "Tuesday","Wednesday","Thursday","Friday", "Saturday" }; int num; printf("Enter a number(0~6):"); scanf("%d",&num); if(num>=0 &&num<=6) printf("%d::%s \n", num, w_day[num]); else printf("Error number!\n"); return 0;}do{ printf("Enter a number(0~6):"); scanf("%d",&num);} while( num<0 || num>6);字符串处理函数q与字符串有关的内置函数在头文件与字符串有关的内置函数在头文件string.h中定义中定义q要使用标准库字符串处理函数,程序前应该包含:要使用标准库字符串处理函数,程序前应该包含: #include string.hstrlenstrcpystrcmpstrcat……字符串的长度p字符串的长度是字符串中位于 \0 之前的字符的个数p根据字符串中 \0 的位置来计算字符串长度。
若:数组中下标为i 的元素为\0,则,串长= i例例】】求字符串的长度求字符串的长度#include int main(){int length=0;char str[30]; printf("Input a String: "); gets(str);while( str[length] !='\0' )length++;printf("\n String length is %d\n", length ); return 0;}a b c d ef g \0串长串长length=7length=0length=1length=2求字符串长度函数求字符串长度函数语法格式:strlen(s);功能:计算字符串s 中字符的个数,并将字符的个数作为函数的返回值,不包括字符 \0include #include int main(){ int length=0; char str[30]; printf("Input a String: "); gets(str); while( str[length] !='\0' ) length++; printf("\n String length is %d\n", length ); return 0;}length= strlen(str);字符串复制函数字符串复制函数语法格式:strcpy(dest,src);功能:把字符数组src中的字符串拷贝到字符数组dest中,\0也一同拷贝。
src也可以是一个字符串常量include #include int main(){char source[ ] = "We change lives";char target[20];strcpy(target, source);printf("\n 源字符串源字符串 = %s", source);printf("\n 目标字符串目标字符串 = %s\n", target);return 0;}目标数组目标数组源数组源数组 源字符串源字符串 = We change lives 目标字符串目标字符串 = We change livestarget= source ; ??字符串不能直接整体赋值,字符串不能直接整体赋值,必须借助必须借助strcpy!!字符串比较函数字符串比较函数语法格式:strcmp(str1,str2);功能:比较字符串str1和str2的大小,返回比较的结果结果为:0--相等,正数--str1大,负数--str2大比较原则:按照串中对应位置字符的ASCII码比较例如: str1str2“abc” 与 “abc” , strcmp(str1,str2)==0“abcd”与 “abck”, strcmp(str1,str2)<0“abc” 与 “ab”, strcmp(str1,str2)>0 “abc” 与 “b”, strcmp(str1,str2)<0 字符串比较函数【例】验证用户输入的用户名及密码是否正确//chap8ex4.c#include #include int main(){char name[15], pwd[15];char sname[ ]="System", spwd[ ]= "123456";int login=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 ");elseprintf("\n 用户名和用户名和/或密码无效!或密码无效! \n ");return 0;} 请输入用户名:请输入用户名:System 请输入密码请输入密码:: 123456 您已成功登录!您已成功登录!name== sname??思考:如何允许用户三次输入密码?思考:如何允许用户三次输入密码?字符串不能用关系运算符比较大小,字符串不能用关系运算符比较大小,必须借助必须借助strcmp!!字符串连接函数字符串连接函数语法格式:strcat(dest,src);功能:连接两个字符数组中的字符串,将src串接在dest串后,结果存放在字符数组dest中,返回的函数值是字符数组dest的首地址。
字符数组dest的长度不可缺省,应足够大目标数组目标数组源数组源数组#include #include int main(){char source_string[ ] = "UPC";char target_string[30] = "Hello ";strcat(target_string, source_string);printf("\n 源字符串源字符串 = %s", source_string);printf("\n 目标字符串目标字符串 = %s\n", target_string);return 0;} 源字符串源字符串 = UPC 目标字符串目标字符串 = Hello UPC字符串举例【例1】不用strcat()函数,编程实现将两个字符串连接起来//chap8ppt27.c#include #include int main(){char source_string[ ] = "UPC";char target_string[30] = "Hello ";int i,j;i=0;while(target_string[i]!='\0')i++;j=0;while(source_string[j]!='\0'){target_string[i+j]=source_string[j];j++;}source_string[j]='\0';printf("源字符串源字符串 = %s\n", source_string);printf("目标字符串目标字符串 = %s\n", target_string);return 0;}字符串举例【例2】输入一行字符,将每个字符从小到大排列后输出//chap8ex5.c#include #include int main (){ char str[100], t; int i, j, n; printf("Input string: "); gets(str); n = strlen(str); /* 冒泡法排序冒泡法排序 */ for(i=0; i str[j+1] ) { t = str[j]; str[j] = str[j+1]; str[j+1] = t; } printf("Sorted string: %s\n",str); return 0;}思考:如何用选择法实现?思考:如何用选择法实现?字符串举例【例3】输入5个单词,将它们从小到大排列后输出//chap8ex6.c#include #include #define N 5int main (){ char str[N][20], t[20]; int i, j; printf("Input %d strings: ",N); for (i=0;i 0 ) {strcpy ( t, str[i]); strcpy (str[i], str[j]); strcpy(str[j], t); } printf(“Result: \n"); for ( i=0; i
//chap8ppt30.c#include #include #define M 20int main(){char str[M];char ch;int i;gets(str);ch=getchar();i=0;while(str[i]!='\0'){if (str[i]==ch) break;i++;}printf("源字符串源字符串 = %s\n", str);printf("%c字符在字符串字符在字符串 %s 中第一次出现的位置是中第一次出现的位置是%d\n", ch,str,i+1);return 0;}字符串举例【例5】判断一个字符串是否回文(顺读和逆读相同)#include #include #define M 20int main(){char str1[M],str2[M];int i,len;gets(str1);len=strlen(str1);i=0;while(str1[i]!='\0'){str2[len-i-1]=str1[i];i++;}str2[len]='\0';if (strcmp(str1,str2)==0)printf("字符串字符串%s是回文串是回文串\n", str1);elseprintf("字符串字符串%s不是回文串不是回文串\n", str1);return 0;}总结p字符串与字符数组的区别是字符串的末尾有一个空字符'\0'以标识字符串结束p用scanf()语句读入字符串时不允许输入中存在空格pgets() 和 puts() 函数分别用于字符串的输入和输出总结char c[6]={ ‘a’,’b’,’c’,’d’,’e’};char c[6]=“abcde”;char c[ ]={ “abcde”};char c[ 6]={‘a’,’b’,’c’,’d’,’e’,’\0’};char str[3][10]={“aaa”,”bbb”,”ccccc”};p字符数组的初始化方法字符数组的初始化方法 ü 字符数组可以整串操作字符数组可以整串操作 %sü 数组名代表数组元素的起始地址数组名代表数组元素的起始地址ü 字符串一定是以字符串一定是以 ‘\0’结尾结尾p 字符数组的输入和输出字符数组的输入和输出总结strcatstrcat 连接连接 (将某串接在一字符数组之后)(将某串接在一字符数组之后)strcpystrcpy 复制(字符串不允许赋值,只能将某串复制(字符串不允许赋值,只能将某串 复制复制给一个字符数组)给一个字符数组)strcmpstrcmp 比较比较 (判断两串是否相等)常用于字符串(判断两串是否相等)常用于字符串按按ASCIIASCII顺序排序的操作顺序排序的操作StrlenStrlen 求长度求长度 (求字符串中所含字符的个数)(求字符串中所含字符的个数)在在 string.hstring.h 中定义了很多字符串处理函数函数,中定义了很多字符串处理函数函数,比较常用的有:比较常用的有:strcpystrcpy()()、、strcatstrcat()()、、strcmpstrcmp() () 和和 strlenstrlen()()。