你的晓白吖

博客园 首页 新随笔 联系 订阅 管理

c语言之部分函数,控制语句

一 输入输出函数

      均封装在stdio.h头文件里

 1.1 getchar()  putchar()

了解函数:所需头文件,原型, 功能,参数,返回值(后三个重点)

getchar功能:从终端读取一个字符,无参数,返回值是从终端读取的字符

putchar   头文件为标准输入输出,功能为向终端输出一个字符,  参数为要输出的字符或者它的ASCII码,

返回值 为

 它要输出的字符

1.2   gets()/puts()

gets:(接收)从终端读取一个字符串     

参数为保存读取的数据的内容,一般是一个数组

gets的返回值为保存的字符串 

注: \n 的一个功能:

刷新缓冲区

puts  显示一个字符串在终端,

标准输入输出函数,参数为要输出的内容

相当于 int puts(const char *s);

参数为要输出的内容

puts返回值为输出的字符串的字节数

puts自带\n

自带换行功能

3.printf()/scanf()

printf为一个行缓冲函数,最大1024kb

先把内容写到缓冲区,满足一定条件后再将内容写入对应的文件中

功能:输出指定内容

刷新缓冲区函数:

scanf:要从缓冲区读取数据时也会刷新缓冲区内的数据

程序结束的时候也会去刷新缓冲区

printf功能:向终端按照一定格式输出字符串

正常情况下原样输出

参数为带格式要输出的内容

格式说明:

 普通字符原样输出,

其他特殊:

%d :32位有符号十进制数

%u 32位无符号十进制

%o  八进制

%x 十六进制

%e  指数形式

%c 字符

%s  字符串

%%    正常输出%时应该多加一个%,防止被系统错误识别

%p 输出对应量指向的地址

 附加格式字符:

#   输出八进制或者十六进制前导符,

l  输出long或者double型的数据

m  设置输出内容的宽度,默认右对齐,不够的地方补空格

-  可以将右对齐改成左对齐

.n  改变小数点后n位

arg  可变参,可有可无,也可有多个

补0可以右对齐,但是不能左对齐

返回值为输出的字节个数

 

 

scanf  

按照格式从终端接收指定内容

int scanf(const char *format, ...);

返回值为成功保存内容的个数

   scanf默认只能保存一个不带空格的字符串

或者可以设置为找到一个换行符才结束输入

或者找到设定值结束

 、

#include <stdio.h>
int main(int argc, const char *argv[])
{
int n=100;
float f=5.11299;
printf("正常输出:%d ,设置宽度输出:%5d, 右对齐:%05d,\n 左对齐:%-5d,0不可以用于左对齐\n 直接输出浮点型:%f",n,n,n,n,f);
printf("限制算上小数点一共可以输出几位,保留小数点可以几位:%6.2f\n",f);

return 0;
}

 

 

 

 

 

 

scanf附加字符:

设置输入宽度,超过则只保存设置宽度的内容

*抑制符  带有*的格式的字符输入的内容不会保存到与之对应的变量中,而是将对应的输入量屏蔽,跳过,直接存入下一个

抑制输入

 %f  浮点型

%c 字符数据

%s 字符串数据

scanf返回值为成功保存的内容的个数

 例: scanf("%d%*d%*d",&a,&b);

输入123,赋值给a,b的分别是1,3

scanf输入多个内容应该适当设置垃圾处理,防止程序出现错误

垃圾处理的常用方式为设置空格

 

二.控制语句

控制一些代码执行,一些代码不执行,或者相同的代码执行很多次

分类语句,分支语句

循环语句,直接执行,判断再执行

辅助控制关键词

if      else语句(如果,,或者)

if语句的形式:

1.单独的if,if(表达式)

判断表达式是否成立,然后执行控制的语句

    if(表达式)

  语句块1

else

  语句块2

  判断表达式是否为真,为假执行语句块2

 

3    if(表达式)

  语句块1 

  else if (表达式)

    语句块2

  else if

.......

else 

语句块n

  if的表达式非0即为真

if(0) 

if(1)

if(0.00000000001)   真 

if(a)        相当于if(a!=0)

if(a!)      相当于if(a==0)

if或者else语句后面只有一条代码的话,可以不加{ }   但一般为了便于阅读,不产生歧义,还是有必要加上

 

 

 

else后面不能跟表达式,if和else只能执行一条,

else无法单独使用

else if后面必须跟表达式

else默认和最近的if关联

if可以进行嵌套,

2.2.2大小写转换

  在终端输入一个字符,如果是大写字母将其转化为小写,如果是小写字符,将其转化为答谢字符并输出

 实现原理:通过ASCII码转换

       2.2.3

        swich  ......case语句

也是分支语句,主要用于条件过多的情况下

switch(变量/变量表达式)

    case 常量或常量表达式1:

    语句块;break;

............

defalut:

语句块n;

 break;

注:

switch后面的表达式为一个变量或者变量表达式

case后面只能跟常量或者常量表达式,且同一个判断中不能相同,否则容易出现错误

case下面控制的语句,就算是多条也可以不加{}

switch中只可以判断整型,字符型

default后面可以不加break,

break主要作用是结束switch语句,不加case就会一直找直到找到

 

循环语句:

功能 :往往会出现一些代码出现很多次,可以通过循环实现,便于书写,提高逻辑性,降低错误率

循环条件不能永远为真,不然就会陷入死循环,while(1)为常用的死循环

经典题目:程序员买房问题  

break; 

 for循环

格式 for(表达式1,表达式2,表达式3)

三个表达式,

先执行表达式1,2 然后进行循环一次,然后再执行表达式3,然后判断表达式2 是否成立,成立则继续循环

表达式2常为判断语句,表达式3常为++    --

表达式1一般负责赋值,初值,在整个循环中只运行一次,也可以省略不写

 for(i=0;i<=0\10;i++)

 

三个表达式均可省略,但是;必须有且必须有三个,三个表达式可在循环中,循环前变相实现

表达式2不写易造成死循环

表达式3为改变循环值从而影响循环次数,省略易造成死循环,也可在语句块里写

如果一个 表达式里有好几个语句,则这些表达式里所有语句均会运行,但是作为系统判断的是循环表达式最后一个语句

for(i=0;i<=10,printf("%d     ",i;i++)      循环会将表达式二中的输出语句当做判断句

do......while语句:

会先执行一次, while判断在循环的最后面;

for和while循环通用

goto语句

主要用于在函数内进行跳转

不建议使用,会降低逻辑性

 

break:

用于结束指定的语句块,主要在循环语句使用

其他只能用于switch语句

 一个函数遇到return(即接收到返回值)就会结束,后面的不会再执行,

  continue:

跳过这次循环,下次循环如果满足条件依然会继续执行

 return代表一个函数的终点

 

数组:

数组的概念:

便于存储相同类型的数据,

内存空间连续

数据类型为构造类型数据,类型可变

构造类型结构体:(数组,结构体,共用体)

 

一维数组的定义:

存储类型,数据类型,数组名 数组大小(数组下标)

存储类型:

auto,register,static,extern

数据类型:  int,char,float,等

数组名:标识符,满足对应命名规则

数组下标:确定数组元素个数

例:int a[10];             定义一个int型数组,最大存储10个元素,占用空间为4*10=40

数组存储顺序从0开始,所以最后一个下标应该是n-1(n为数组元素个数)

数组在定义和使用时,下标尽量不要使用变量,防止变量改变带来的影响数组操作,能写常量或者常量表达式就写

数组名相当于一个长指针,不能修改地址,

数组和指针的区别:

数组用于存储多个相同类型数据,是个集合

指针 :相当于变量,但与普通变量不同,存放其它变量的内存地址

数组相当于变相的指针

赋值:    指针变量类型相同可互相赋值,但数组赋值必须使用for循环,手动输入,拷贝等方法赋值

数组的存储是连续的,按照申请的空间依次存放,多维数组逻辑上多维,实际上的内存还是一维地址

数组要么存放在静态区,要么存放在栈上

指针:可以指向任何类型数据的地址,指针类型说明它指向的地址空间内存

sizeof的使用:

数组占用内存空间: sizeof(数组名)

数组大小: sizeof(数组名)/数组类型单元素占字节数

指针的内存固定,32位下内存名固定为4,64位下内存名固定为8

字符数组一般按字符初始化,例:

char  a[]={“huanyinglaidaoangongda”};

char a[]={'n','h','r','g';

int  c[]={1,2,3,4,2,4,8}

delete[]   数组名      对数组进行销毁(仅限一维数组)

二维数组的内存释放:

for(int i=0;i<row;i++)

{delete[]  数组名[i]

}

delete[]  数组名;

       以上合起来才能销毁二维数组

指针数组:是数组,每个元素存放一个指针类型的元素

int* 数组名[9];

相当于[]优先级比较高,定义该为数组,

数组指针  定义为指针,指向数组的一个指针

int (*指针名)[8];

*先和指针名结合,定义其为指针

指向一个数组

数组进行传参则会变成指针

原因: c语言只会以拷贝的方式传参,参数传递是拷贝整个数组就会降低效率,且容易导致溢出,所以,数组在进行参数传递时,将数组定义为一个指针(常量指针),直接传首元素地址

 

 

指针的传参:

    一级指针可以直接传参,二级指针可以接受的参数: 二级指针变量,一级指针变量地址,一维指针变量地址,一维指针数组的数组名

 

posted on 2022-01-18 21:14  你的晓白吖  阅读(56)  评论(0)    收藏  举报