07-字符与字符串-c语言初学系列

知识要点

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[i]);     
char c[8]={’I’,’ ’,’l’,’i’,’k’,’e’,’ ’,’C’};

字符数组除了在定义时初始化,只能一个元素一个元素的赋值。

字符数组中的全部内容输出,也只能一个元素一个元素的输出。

  for(i=0;i<8;i++)
printf(“%c”,c[i]); 

上述方式只能用于处理已知个数的字符序列,并且当字符序列发生变化时,字符数组无法伴随字符序列长度的变化而变化。

字符串

在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[i]);     
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[i]); 
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[i]);    
    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
 teacher

printf()函数与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: Happy

8.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[i]!=’\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=str2

str1,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[i]!=’\0’;i++)
    string1[i]=string2[i];
 string1[i]=’\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,-2

strcmp(字符串1,字符串2)

#include <stdio.h>
#include <string.h>
int string_compare(char string1[],char string2[])
{ int i=0;
  while(string1[i]= =string2[i]&&string1[i]!='\0')
    i++;
  return string1[i]-string2[i];  }
void main()    
{ char str1[]=”abc”,str2[]=”abc”;
   printf(“%d, %d\n”, strcmp(str1,str2),string_compare(str1,str2));}
运行结果 : 0,0

strlwr(字符串)

strlwr()的作用是将字符串中大写字母转换成小写字母。例如:

printf(“%s”,strlwr(“BeiJing”));
输出:beijing

strupr(字符串)

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[i]);      /*name[i]是一个一维字符数组*/
  for (i=0;i<3;i++)
         printf(“%s\n”,name[i]);   
} 

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[i],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[i]!='\0';i++)
    { if(string[i]==' '&&letter==1)
          letter=0;
      if(string[i]!=' '&&letter==0)
          { letter=1;
            num++;
           }
     }
  printf("There are %d words.\n",num);
  }

分析

/*---  程序L8_12.C : 有3个英文字符组成的字符串,要求按照英文字母顺序输出。  
----*/
 #include <stdio.h>
 #include <string.h>
 void main( )                     
 {
  char name[3][20]={"John","jan","Anny"};
  char str[20];
  int i;
  /*字符串中所有字符转换为小写字母*/
  for(i=0;i<3;i++)
     strlwr(name[i]); 
  /*按照英文字母顺序排序*/
  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("%s\n",name[i]); 
 }

作业

  1. 编写一个函数string_change(char str[]),要求实现str中的字符的互换。如”abcde”换成”edcba”。
  2. 编写一个函数char_search(char str[],char c),如果字符串str中包含字符c则返回数值1,否则返回数值0。
  3. 编写一个函数string_cut(char string[],char c),其功能是删除字符串中所有的字符变量c,例如
    char string=“abaca”; char c=’a’;
    则执行string_cut(string,c)后,string的内容变为”bc”。
  4. 编写一个函数string_search(char str1[],char str2[]),如果字符串str1中包含字符串2则返回数值1,否则返回数值0。

ps:此教程配套ppt下载地址如下,如果需要可以下一下,不过其实也无所谓,这篇文章就是全部文本。

https://download.csdn.net/download/qqhxmdq/87007735

 全部课程的PPT已经整理好了,需要的童鞋可以点击下载
总-自己使用的C语言教程PPT-适合老师备课或者自学-15篇PPT合集.zip-C文档类资源-CSDN下载

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锁住子锁不住

老少爷们向前冲!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值