|
知识要点
8.1 单个字符的输入输出
8.2 字符数组与字符串
8.3 字符串的输入和输出函数
8.4 字符串操作函数
8.5 二维字符串数组
8.1 单个字符的输入输出
C语言头文件“stdio.h”中定义了两个专门用于单个字符输入输出的函数getchar()和putchar()。
一、字符输入函数getchar()
作用是从输入设备(如键盘)读取一个字符。
函数getchar()没有参数,其一般形式为
getchar( );其执行结果是从输入设备得到一个字符。例如:
char c;
c=getchar();从键盘输入:a
则字符型变量c等于字符’a’。上式等价于
scanf(“%c”,&c);(1)getchar()一次只能接收一个字符。
例如scanf(“%c%c”,&c1,&c2);语句如果用getchar()函数实现只能写成:
c1=getchar();c2=getchar();(2)getchar()可以接收回车字符。而scanf()将回车作为数据的间隔符或结束符。
(3)getchar()接收的字符可以不赋给任何变量。
二、字符输出函数putchar()
putchar()函数作用是将一个字符输出到输出设备(如显示器)。它的一般形式为
putchar(字符型或整型数据);
例如:char c=’A’;
putchar(c); 结果是输出字符变量c的值。
函数putchar()的可以输出字符型变量、整型变量、字符型常量以及控制字符和转义字符。
putchar()函数一次只能输出一个字符,printf()函数可以同时输出多个字符
8.2 字符数组与字符串
字符数组
一个数组的元素是字符型,则该数组为字符数组
字符数组的赋值可以采用三种方法:
char c[8];
c[0]=’I’; c[1]=’ ’; c[2]=’l’; c[3]=’i’; c[4]=’k’; c[5]=’e’; c[6]=’ ’; c[7]=’C’;
char c[8];
int i;
for(i=0;i<8;i++)
scanf(“%c”,&c);
char c[8]={’I’,’ ’,’l’,’i’,’k’,’e’,’ ’,’C’};

字符数组除了在定义时初始化,只能一个元素一个元素的赋值。
字符数组中的全部内容输出,也只能一个元素一个元素的输出。
for(i=0;i<8;i++)
printf(“%c”,c); 上述方式只能用于处理已知个数的字符序列,并且当字符序列发生变化时,字符数组无法伴随字符序列长度的变化而变化。
字符串
在C语言中,字符序列当作字符串来处理。字符串的处理是基于字符数组的。
字符串在实际存储时其尾部添加了一个结束标志’\0’
’\0’代表ASCII码为0的字符,是一个空操作符,表示什么也不干。
将”I like C”放入数组c中

输入:
char c[9];
c[0]=’I’; c[1]=’ ’; c[2]=’l’; c[3]=’i’; c[4]=’k’; c[5]=’e’; c[6]=’ ’; c[7]=’C’;c[8]=’\0’;
char c[9];
int i;
for(i=0;i<8;i++)
scanf(“%c”,&c);
c[8]=’\0’;
char c[9]={’I’,’ ’,’l’,’i’,’k’,’e’,’ ’,’C’,’\0’};字符串除了具备以上字符数组的处理方式之外,还可以采用C语言提供的输入输出字符串的格式符“%s”,则字符串的第四种输入方法是:
char c[9];
scanf(“%s”,c);需要注意的是:当格式符为“%s”时,scanf()函数的地址列表是字符数组的名字,并且无需加地址符&。
scanf(“%s”,c[9]);
scanf(“%s”,c);
scanf(“%s”,&c);采用字符串的格式符“%s”的输出方法是:
printf(“%s”,c);当格式符为“%s”时,printf()函数中格式符对应的变量是字符数组的名字。
利用格式符“%s”输入输出字符串,字符数组只要不小于字符串的个数即可。所以这是C语言中最常用的字符串处理方法。
程序L8_3.C:分别用两种方法从键盘输入Hello,并输出
#include <stdio.h>
void main()
{ char str1[6],str2[10];
int i;
for(i=0;i<5;i++)
scanf(“%c”,&str1);
str1[5]=’\0’;
scanf(“%s”,str2);
printf(“%s\n%s\n”,str1,str2);
}
8.2 字符数组与字符串
字符串
字符串的初始化可以采用如下方法:
char c[9]={“I like C”};
char c[9]=”I like C”;
char c[]=”I like C”;字符串初始化时,字符数组长度可以大于字符串长度,例如
char c[20]=”I like C”;
char c[9]={’I’,’ ’,’l’,’i’,’k’,’e’,’ ’,’C’,’\0’};8.3 字符串的输入和输出函数
C语言提供了字符串的输入输出函数gets()和puts(),用于整串字符串的输入输出。它们在头文件“stdio.h”中定义的。
字符串输出函数puts()
puts(字符数组名); 或 puts(字符串) ;
例如:char str[]=”I like C”; puts(str);
或:puts(“I like C”);函数puts()一次只能输出一个字符串。
函数puts()可以输出转义字符
函数puts()输出字符串后自动换行。
字符串输出函数puts()
#include <stdio.h>
void main()
{ char str1[]=”student”,str2[]=”teacher”;
puts(str1); puts(str2);
printf(“%s”,str1);
printf(“%s”,str2);
printf(“\n%s\n%s”,str1,str2);}
运行结果 :student
teacher
studentteacher
student
teacherprintf()函数与puts()相比,一是可以同时输出多个字符串,二是可以灵活控制是否换行。
字符串输入函数gets()
gets()作用是将一个字符串输入到字符数组中
gets(字符数组名); 例如:char str[20]; gets(str);
gets()函数同scanf()函数一样,在读入一个字符串后,系统自动在字符串后加上一个字符串结束标志’\0’。
函数gets()只能一次输入一个字符串。
函数gets()可以读入包含空格和TAB的全部字符,直到遇到回车为止。
程序L8_5.C功能:函数gets()与scanf()的区别。
#include <stdio.h>
void main()
{ char str1[20],str2[20];
gets(str1);
scanf(“%s”,str2);
printf(“str1: %s\n”,str1);
printf(“str2: %s\n”,str2);
}
输入:Happy New Year
Happy New Year
输出:str1: Happy New Year
str2: Happy8.4 字符串操作函数
C语言提供了很多字符串操作函数,其对应的头文件为string.h。用到这些函数时,需要在程序内添加#include <string.h> 。
strlen(字符串)
strlen()是测试字符串实际长度的函数,它的返回值是字符串中字符的个数(不包含’\0’)。
strlen(“Beijing”);
程序L8_6.C功能:函数strlen()的使用。
#include <stdio.h>
#include <string.h>
void main()
{ int i;
char str1[20],str2[20];
gets(str1); gets(str2);
for(i=0;str2!=’\0’;i++);
printf(“%s : %d\n”,str1,strlen(str1));
printf(“%s : %d\n”,str2,i);
printf(“%s : %d\n”,”I like C”,strlen(“I like C”)); }举一反三 :编写一个函数int string_len(char str[]),其返回值为字符串长度(不含’\0’)。
问题
字符串能不能使用赋值语句?
char str1[30]
char str2[30]=“I like C”
str1=str2str1,str2分别是两个数组的地址
strcpy(字符数组1,字符串2)strcpy()用于将字符串2复制到字符数组1中
例如:char str1[20],str2[]=”I like C”,str3[20];
strcpy(str1,str2); strcpy(str3,”I like C”);函数strcpy()使用时注意
字符数组1必须足够大,以便容纳字符串2的内容。
字符串2可以是字符数组名或者字符串常量。当字符串2为字符数组名时,只复制第一个’\0’前面的内容(含’\0’),其后内容不复制。
strcpy(字符数组1,字符串2)
程序L8_7.C功能:编写一个函数string_copy()完成strcpy()的作用。
void string_copy(char string1[],char string2[])
{int i;
for (i=0;string2!=’\0’;i++)
string1=string2;
string1=’\0’;
}举一反三 :已知char str1[20]=”student”, str2[20]=”teacher”,要求str1和str2中的内容互换
strcat(字符数组1,字符串2)字符串2的内容复制连接在字符数组1的后面,其返回值为字符数组1的地址。
char str1[30]=”Beijing”,str2[]=”Shanghai”;
strcat(str1,str2);
printf(“str1:%s\n,str2:%s\n”,str1,str2);
输出结果为:
str1:BeijingShanghai
str2:Shanghai

strcat(字符数组1,字符串2)字符数组1不能是字符串常量,并且必须足够大,以便可以继续容纳字符串2的内容。
连接前字符数组1的’\0’将被字符串2覆盖,连接后生成的新的字符串的最后保留一个’\0’。
举一反三 :编写一个函数string_link(char str1[],char str2[ ])完成strcat()的功能。
strcmp(字符串1,字符串2)作用是比较字符串1和字符串2。两个字符串从左至右逐个字符比较(按照字符的ASCII码值的大小),直到字符不同或者遇见’\0’为止。
如果全部字符都相同,则返回值为0。如果不相同,则返回两个字符串中第一个不相同的字符的ASCII码值的差,即串1大于串2时函数值为正,否则为负。
char str1[]=”abc”,str2[]=”abc”;
char str3[]=”aBc”,str4[]=”cbcde”;
printf(“%d,%d,%d\n”,strcmp(str1,str2),strcmp(str1,str3),strcmp(str1,str4));
输出结果为:0,32,-2strcmp(字符串1,字符串2)
#include <stdio.h>
#include <string.h>
int string_compare(char string1[],char string2[])
{ int i=0;
while(string1= =string2&&string1!=&#39;\0&#39;)
i++;
return string1-string2; }
void main()
{ char str1[]=”abc”,str2[]=”abc”;
printf(“%d, %d\n”, strcmp(str1,str2),string_compare(str1,str2));}
运行结果 : 0,0strlwr(字符串)
strlwr()的作用是将字符串中大写字母转换成小写字母。例如:
printf(“%s”,strlwr(“BeiJing”));
输出:beijingstrupr(字符串)
strupr()的作用是将字符串中小写字母转换成大写字母。
问题
输入全班同学的姓名,如何定义?
一个同学的姓名用 一维字符数组表示
char name[30]=“Jacky” 多个同学可以用 二维字符数组表示
char name[2][30]={“Jacky”,”Andy”}8.5 二维字符串数组
一维字符数组中存放一个字符串,
char s1[20]=”John”如果有多个字符串时,例如1个班级的学生的姓名,则需要用到二维字符串,如name[30][20]可以描述30名学生的姓名(假设姓名不超过20个字符)。
如果有2个班级各30名学生,那么它们的姓名可以使用三维数组name[2][30][20]。
二维字符串数组的初始化
二维字符串数组的初始化,可以采用二维字符数组初始化形式或者字符串初始化形式,如:
char name[2][10]={{’J’,’o’,’h’,’n’,’\0’},{’M’,’a’,’r’,’r’,’y’,’\0’}};
char name[2][10]={{”John”},{”Marry”}};
char name[2][10]={”John”,”Marry”};二维字符串数组的赋值和引用
由于二维数组可以看作是一个特殊的一维数组,它的数组元素是一个一维数组。所以二维字符串数组可以看作是这样一个一维数组,它的元素是一个字符串。
二维数组name[2][10]由name[0]和name[1]组成,name[0]代表字符串”John”、name[1]代表字符串”Marry”。
程序L8_9.C功能:从键盘输入三个学生姓名,并输出。
#include <stdio.h>
#include <string.h>
void main()
{ char name[3][30];
int i;
for (i=0;i<3;i++)
gets(name); /*name是一个一维字符数组*/
for (i=0;i<3;i++)
printf(“%s\n”,name);
}
L8_10.C:输入英文月份单词,输出对应月的数字形式。
#include <stdio.h>
#include <string.h>
int search(char list[][20],char name[],int m)
{int i;
for(i=0;i<m;i++)
if(strcmp(list,name)= =0) break;
return i;}
void main()
{
char month_list[12][20]={“January”,”February”,”March”,”April”,”May”,”June”,”July”,”August”,”September”,”October”,”November”,”December”}, month[20];
int n;
gets(month); n=search(month_list,month,12);
if (n<12) printf(“%s 表示 %d月 \n”,month,n+1);
else printf(“查无此单词\n”);}
/*---------------------------------------------------------------
程序L8_11.C : 输入一行字符,统计其中单词的个数。约定单词之间以空格分隔。
--------------------------------------------------------------*/
#include <stdio.h>
void main( )
{
char string[100];
int i ,num=0,letter=0;
/*letter为0时记录前一状态为空格状态,letter为1时前一状态为字符状态*/
gets(string);
for (i=0;string!=&#39;\0&#39;;i++)
{ if(string==&#39; &#39;&&letter==1)
letter=0;
if(string!=&#39; &#39;&&letter==0)
{ letter=1;
num++;
}
}
printf(&#34;There are %d words.\n&#34;,num);
}分析

/*--- 程序L8_12.C : 有3个英文字符组成的字符串,要求按照英文字母顺序输出。
----*/
#include <stdio.h>
#include <string.h>
void main( )
{
char name[3][20]={&#34;John&#34;,&#34;jan&#34;,&#34;Anny&#34;};
char str[20];
int i;
/*字符串中所有字符转换为小写字母*/
for(i=0;i<3;i++)
strlwr(name);
/*按照英文字母顺序排序*/
if (strcmp(name[0],name[1])>0)
{strcpy(str,name[0]);
strcpy(name[0],name[1]);
strcpy(name[1],str);
}
if (strcmp(name[0],name[2])>0)
{strcpy(str,name[0]);
strcpy(name[0],name[2]);
strcpy(name[2],str);
}
if (strcmp(name[1],name[2])>0)
{strcpy(str,name[1]);
strcpy(name[1],name[2]);
strcpy(name[2],str);
}
for(i=0;i<3;i++)
printf(&#34;%s\n&#34;,name);
}作业
- 编写一个函数string_change(char str[]),要求实现str中的字符的互换。如”abcde”换成”edcba”。
- 编写一个函数char_search(char str[],char c),如果字符串str中包含字符c则返回数值1,否则返回数值0。
- 编写一个函数string_cut(char string[],char c),其功能是删除字符串中所有的字符变量c,例如
char string=“abaca”; char c=’a’;
则执行string_cut(string,c)后,string的内容变为”bc”。
- 编写一个函数string_search(char str1[],char str2[]),如果字符串str1中包含字符串2则返回数值1,否则返回数值0。
ps:此教程配套ppt下载地址如下,如果需要可以下一下,不过其实也无所谓,这篇文章就是全部文本。
全部课程的PPT已经整理好了,需要的童鞋可以点击下载
总-自己使用的C语言教程PPT-适合老师备课或者自学-15篇PPT合集.zip-C文档类资源-CSDN下载
学习编程,必须要有一款质量过硬的电脑,一般配置建议8G+ 内存,500g硬盘,i5以上处理器。再有就是便宜一点。比如: |
|