目录

  • 1 第一章 C语言简介
    • 1.1 C语言前世今生
    • 1.2 主流开发环境介绍
    • 1.3 第一个小程序解析
    • 1.4 常见编译错误
    • 1.5 章节知识点小结
  • 2 算法基础
    • 2.1 算法-程序的灵魂
    • 2.2 算法的描述-流程图
  • 3 数据类型与运算符
    • 3.1 数据描述
    • 3.2 运算符和表达式1
    • 3.3 运算符和表达式2
    • 3.4 章节知识点小结
  • 4 顺序结构程序设计
    • 4.1 输入和输出
    • 4.2 顺序结构程序设计
    • 4.3 章节知识点小结
  • 5 选择结构程序设计
    • 5.1 关系运算符和关系表达式
    • 5.2 逻辑运算符和逻辑表达式
    • 5.3 if语句
    • 5.4 条件运算符
    • 5.5 switch语句
    • 5.6 章节知识点小结
  • 6 循环结构程序设计
    • 6.1 while循环结构
    • 6.2 do_while循环结构
    • 6.3 for循环结构
    • 6.4 循环的嵌套
    • 6.5 break语句和continue语句
    • 6.6 章节知识点小结
  • 7 数组
    • 7.1 一维数组
    • 7.2 二维数组
    • 7.3 字符数组
    • 7.4 章节知识点小结
  • 8 函数
    • 8.1 子程序设计
    • 8.2 函数定义
    • 8.3 函数的调用
    • 8.4 局部变量和全局变量
    • 8.5 参数传递
    • 8.6 函数递归调用
    • 8.7 章节知识点小结
  • 9 指针
    • 9.1 指针的基本概念
    • 9.2 指针变量的定义及引用
    • 9.3 通过指针引用数组元素
    • 9.4 指向多维数组的指针和指针变量
    • 9.5 用指向数组的指针作函数参数
    • 9.6 指针与字符串
    • 9.7 函数指针和指针函数
    • 9.8 章节知识点小结
  • 10 用户自己建立数据类型
    • 10.1 定义和使用结构体变量
    • 10.2 使用结构体数组
    • 10.3 结构体指针
    • 10.4 章节知识点小结
  • 11 编译预处理
    • 11.1 宏定义预处理
    • 11.2 文件包含预处理
    • 11.3 条件编译预处理
    • 11.4 章节知识点小结
  • 12 文件
    • 12.1 文件的基本知识
    • 12.2 文件的基本操作
    • 12.3 章节知识点小结
字符数组



1.字符数组的定义

char c[5];   

用关键字char定义字符型数组cc数组长度为5,即包含5个数组元素,每个元素

存放一个字符。可直接使用赋值语句对字符数组元素赋值。

c[0]=’c’ ;   

2.字符数组的初始化

也可以在定义数组的同时,对数组元素进行初始化。

char c[5]={C,h,i,n,a};

若数组长度为10,只给部分元素初始化,其余元素为空字符\0。′\0′代表ASCII码为0的字符,是一个空操作符,什么都不做,仅用它作为字符串结束标志。

3.数组元素的引用

 输出数组中的字符

 for(i=0;i<5;i++)

    printf(%c″,c[i] );           %c格式逐个字符输出

输出结果为china,多个字符,即字符串。

也可直接用字符串常量对字符数组进行初始化:

char c[]={China};  

char c[]=China;                   该初始化方式更简单

等价于:

char c[]={C,h,i,n,a,\0}; 在原基础上增加一个\0

%c输出一个字符,%s输出一个字符串。

printf(%s″,c );

%s格式输出字符串时,输出项是字符数组名,而不是数组元素。

  错误:  printf(%s″,c[i] );

  数组名代表数组的起始地址,表示从这个起始地址开始逐个输出其中的字符,直到遇  

\0′为止不再输出。′\0′为空操作符,不显示。

  

  可用scanf函数输入一个字符串:

  char c10;

  scanf(%s″,c); 因为数组名本身就代表该数组的起始地址,所以数组名前不要再加地址符&.

4.字符串处理函数

    puts:输出字符串   gets:输入字符串 

    strcpy:字符串复制  strcmp:字符串比较                

    strcat:字符串连接  strlen:求字符串的长度        

  stulwr:将字符串转换成小写形式       strupr:将字符串转换成大写形式

  ①puts函数

  形式: puts (字符数组)

作用:将一个字符串输出到终端。

char s[]={China};

puts(s);

puts(Beijing);    括号里的参数可以是字符数组,也可以是字符串常量。

输出字符串后自动换行。

gets函数

  形式:gets(字符数组)

  作用:输入一个字符串到字符数组。     

  gets(s);

注:putsgets只能输入或输出一个字符串。

   puts(s1s2);

 gets(s1s2);

strcpy函数

   形式:strcpy(字符数组1,字符串2)

   作用:将字符串2复制到字符数组1中。

   例如:

     char s10],t[]={China};

     strcpy(st);

     puts(s); 

错误:s=t;

s=China;

strcmp函数

 形式:strcmp (字符串1,字符串2)

 作用:比较两个字符串的大小。

 例如:strcmp(s1s2);

       strcmp(China″″Chine);

       

逐个字符按ASCII码值比较

比较的结果由函数值带回:

(1)字符串1=字符串2,函数值为0 ;

(2)字符串1>字符串2,函数值为1 ;

(3)字符串1<字符串2,函数值为-1

错误:if(s1>s2) printf(″yes\n″);

正确:if(strcmp(s1s2)>0) printf(″ yes\n ″);

strcat函数

 形式strcat(字符数组1,字符数组2)

 作用:连接两个字符数组中的字符串,结果 放在字符数组1中。

strlen函数

 形式strlen (字符数组)

 作用:测试字符串的长度(不包括′\0).

strlwr函数

  形式:strlwr (字符数组)

  作用:将字符串中大写字母换成小写字母。

strupr函数

  形式:strupr (字符数组)

  作用:将字符串中小写字母换成大写字母。     4个函数课后自学

:3个数,求其中最大数。

  #include <stdio.h>

  void main( )

{ int a,b,c,max;    //定义三个字符数组存放三个字符串,max数组存放最大字符串

 scanf(%d,%d,%d,&a,&b,&c);  

 if(a>b) max=a; else max=b;

 if(c>max)max=c;

 printf(″最大数为:\n,max);

}  

:3个字符串,求其中最大字符串。

    char a[10],b[10],c[10],max[10];     定义三个字符数组存放三个字符串,max数组存放最大字符串

gets(a); gets(b); gets(c);          分别输入三个字符串

if (strcmp(a,b)>0)  strcpy(max,a);  a数组中字符串和b数组中字符串比较

else strcpy(max,b);                 较大的字符串用max数组存放

 if (strcmp(c,max)>0) strcpy(max,c);  c数组中字符串和max数组字符串比较

puts (max);                          max存放最大字符串,输出

演示最大字符串.cpp

 思考:用一个二维字符数组存放三个字符串

  char s[3][10];

for (i=0;i<3;i++)

      gets (s[i]);

如何进行比较,求最大的字符串?


字符串是存放在字符数组中的。引用一个字符串,可以用以下两种方法。

(1) 用字符数组存放一个字符串,可以通过数组名和格式声明“%s”输出该字符串,也可以通过数组名和下标引用字符串中一个字符。

(2) 用字符指针变量指向一个字符串常量,通过字符指针变量引用字符串常量。

1.利用字符数组处理字符串应用

 例:定义一个字符数组,在其中存放字符串“I love China!”,输出该字符串和第8个字符。

#include <stdio.h>

int main()

{ char string[]=“I love China!”; 

   printf(“%s\n”,string); 

   printf(“%c\n”,string[7]);  

   return 0;

}

2.指向字符的指针变量处理字符串 

可以不定义字符数组,而定义一个指向字符的指针变量,并将字符串的起始地址赋给指针变量,通过该指针变量亦可以实现字符串的操作。

例:通过字符指针变量输出一个字符串。 

#include <stdio.h>

int main()

{ char *string=“I love China!”; 

   printf(“%s\n”,string); 

   return 0;

}

用指向字符的指针变量处理字符串与用字符数组处理字符串的许多操作都类似,但也有许多不同之处。主要区别有:

(1) 在用字符数组处理字符串时,可以认为是将整个字符串的内容赋给了字符数组;但在用指向字符的指针变量处理字符串时,就不能认为是将整个字符串的内容赋给了指向字符的指针变量,而只是将字符串常量的指针赋给了该指针变量。

(2) 数组名是指针常量,不能重新被赋值;而指向字符串的指针变量是可以被重新赋值的,即可以使指针变量重新指向其他字符。 

(3) 要想将字符串常量直接赋给字符数组,只能通过初始化的方式实现,否则就只能将字符串常量每个字符逐个赋给字符数组的每个元素。

例:将字符串a复制为字符串b,用指针变量来处理。

解题思路:定义两个指针变量p1和p2,分别指向字符数组a和b。改变指针变量p1和p2的值,使它们顺序指向数组中的各元素,进行对应元素的复制。

参选代码:

#include<stdio.h>

intmain()

{chara[]="I am a boy.",b[20],*p1,*p2;

  p1=a; p2=b;

  for(  ; *p1!=‘\0’;p1++,p2++)

      *p2=*p1;

  *p2=‘\0’;

  printf(“stringa is:%s\n”,a);

  printf(“stringb is:%s\n”,b);

  return 0;

}


如果想把一个字符串从一个函数“传递”到另一个函数,可以用地址传递的办法,即用字符数组名作参数,也可以用字符指针变量作参数。

在被调用的函数中可以改变字符串的内容,在主调函数中可以引用改变后的字符串。

例:用函数调用实现字符串的复制。

解题思路:定义一个函数copy_string用来实现字符串复制的功能,在主函数中调用此函数,函数的形参和实参可以分别用字符数组名或字符指针变量。分别编程,分析比较。

(1) 用字符数组名作为函数参数

#include <stdio.h>

int main()

{void copy_string(char from[],char to[]);

  char a[]="I am a teacher.";

  char b[]="you are a student.";

  printf(“a=%s\nb=%s\n",a,b);

  printf("copy string a to string b:\n");

  copy_string(a,b); 

  printf(“a=%s\nb=%s\n",a,b);  

  return 0;

}

void copy_string(char from[], char to[])  

{ int i=0;

   while(from[i]!='\0')

   {   to[i]=from[i];

        i++;

    }

    to[i]='\0';

}

(2)用字符指针变量作形参

void copy_string(char *from, char *to) 

{  for(  ;*from!='\0'; from++,to++)

      {  *to=*from;   }

   *to='\0';

练习:

写一函数,将字符串1中从第m个字符开始的全部字符复制到另一字符串中。在主函数调用该函数,并输出复制后的字符串。

分别在程序中按以下两种情况处理:

(1)函数形参用数组名。

(2)函数形参用指针变量。