C语言总结day03

day03

1、数据的输入输出

  • 数据的输出:从计算机向输出设备(如显示器、打印机等)输出数据称为输出。

  • 数据的输入:从输入设备(如键盘、磁盘、光盘、扫描仪等)向计算机输入数据称为输入。

    • C语言函数库中有一批"标准输入输出函数",它是以标准的输入输出设备(一般为终端设备)为输入输出对象的。主要有:putchar(输出字符)、getchar(输入字符)、printf(格式输出)、scanf(格式输入)、puts(输出字符串)、gets(输入字符串)
    • 注意:在使用系统库函数的时候,要在程序文件的开头用预处理指令#include把有关的头文件放在本程序中。(例如:#include<stdio.h>或#include “stdio.h”)。在程序进行编译预处理时,系统将stdio.h头文件的内容调用出来放在此位置,取代本行的include指令。
      • 两者的区别:用尖括号形式(如<stdion.h>)时,编译系统从存放C编译系统的子目录中去找所要包含的头文件(如stdio.h),这称为标准方式。如果用双撇号形式(如"stdio.h"),在编译时,编译系统先在用户的当前目录(一般是用户存放源程序文件的子目录)中寻找要包含的文件,若找不到,再按标准方式查找。若头文件不在用户存放源程序的目录中,则可以使用绝对路径(如#include"C:\temp\file1.h")。
      • 因此在使用系统库函数时用第一种,而使用用户自定义头文件的时候使用第二种。
  • printf的使用
    定义函数 int printf(const char * format,…);

    函数说明 printf()会根据参数format字符串来转换并格式化数据,然后将结果写出到标准输出设备,直到出现字符串结束(‘\n’)为止。

    参数format字符串可包含下列三种字符类型:

    (1)一般文本(即普通字符,如逗号、空格),伴随直接输出。

    (2)转义字符,如\t、\n等。

    (3)格式转换字符,格式转换为一个百分比符号(%)及其后的格式字符所组成。一般而言,每个%符号在其后都必需有一printf的参数与之相呼应(只有当%%转换字符出现时会直接输出%字符)

    格式转换字符详解 “%[符号][宽度][.精度]类型”

    [宽度]:表示输出的数据所占的列数,例若"%5d",表示输出数据占5列,输出的数据显示在此5列区域的右侧。

    [符号]:“-”表示对齐方式

    (1)%-8,左对齐,当显示字符不足8个时,右补空格

    (2)%08,右对齐,当显示字符不足8个时,左补0

    [.精度]对于浮点数表示小数点后的位数

    数值小数点后的位数大于显示精度,则只能显示[.精度]个小数位数(四舍五入),如果数值小数点后的位数小于显示精度,则补零。%.5 小数点后显示5位

    类型:

    (1)%d:用于显示十进制有符号数,char,short,int,long long(若输出long(长整型)数据,在格式符d前加字母l(代表long).即"%ld".若输出long long(双长整型)数据,在格式符d前加两个字母ll(代表long long).即"%lld")

    (2)%u:用于显示十进制无符号数,unsinged short,unsigned int,unsigned long long

    (3)%x: 用于显示十六进制整数,所有有符号及无符号整型

    (4)%f:用于显示十进制浮点数,float,double
    基本型,用%f;不指定输出数据的长度,由系统根据数据的实际情况决定数据所占的列数。系统处理的方法一般是:实数中的整数部分全部输出,小数部分输出6位。
    指定数据宽度和小数位数,用%m.nf;数值小数点后的位数大于显示精度,则只能显示[.精度]个小数位数(四舍五入),如果数值小数点后的位数小于显示精度,则补零。%.5 小数点后显示5位.例"%7.2"格式指定了输出的数据占7列,其中包括2位小数。如果把小数部分指定为0,则不仅不输出小数,而且小数点也不输出。例如"%7.0f"的话,之后输出整数部分。如果是1.0/3的,输出0;

    (5)%c:显示字符(一个整数,若在0~127范围中,也可以用"%c"使之按字符形式输出,在输出前,系统会将该整数作为ASCII码转换为对应的字符)

    (6)%s:显示字符串

    (7)%e:指定以指数形式输出实数。
    如果不指定输出数据所占的宽度和数字部分的小数位数,许多编译系统会自动给出数字部分的小数位数为6位,指数部分占5列(如e+002,其中"e"占1列,指数符号占1列,指数占3列),数值部分按标准化指数形式输出(即小数点前必须有而且只有1位非零数字):例如:printf(“%e”,123.456);输出为:1.234560 e+002(234560共6列,e+002共5列)共13列。
    也可以用"%m.ne"形式的格式说明:如printf(“%e”,123.456);输出为: 1.23e+002数的前面有4个空格。
    (8)i格式符:和d一样。
    (9)o格式符:以八进制整数形式输出。将内存单元中的各位的值(0或1)按八进制形式输出。因此输出的数值不带符号。例如(int i=-1;printf(“%o”,i);输出为37777777777)
    (10) g格式符:用来输出浮点数,系统自动选择f格式或e格式。选择其中长度较短的格式,不输出无意义的0.

    printf(“%s”,xxx)与puts(xxx)的区别:puts函数会自动添加换行,而printf(“%s”,……)不会。

  • scanf的使用
    定义函数 int scanf(const char * format,…);

    函数说明 scanf()会将输入的数据根据参数format字符串来转换并格式化数据。Scanf()格式转换的一般形式如下:
    
    “%[宽度][数据所占字节数]输入类型”
    
    [宽度]:最多输入的字符个数
    
    [数据类型]:
    
    h表示两字节,短整型数据,short 如"%hd"
    
    l表示八字节,用于long long和 double
    
    什么都没有表示四字节
    
    [数据类型]输入类型
    
    (1)%d:int
    
    (2)%f:float
    
    (3)%lf:double
    
    (4)%hd:short
    
    scanf(“%c”,&x) 等价于 x = getchar(),虽然getchar的返回值是int类型,但不影响使用
    
    (5)%s:字符串
    
    用scanf读取字符串时,忽略前导的空白符,再次遇到空白符会结束输入,并将再次遇到的空白符留在缓冲区内,自动添加字符串数组的结束标志'\n'。
    -注意:scanf("a=%f,b=%f,c=%f",&a,&b,c&);正确输入为:a=1,b=2,c=3 而如果只输入1 2 3就错了,因为系统会把它和scanf函数中的格式字符串逐个字符对照检查的,只是在%f的位置上代以一个浮点数。(在"a=1"的后面输入一个逗号,与scanf函数中的"格式控制"的逗号对应;scanf("a=%f b=%f c=%f",&a,&b,c&);正确输入为:a=1 b=2 c=3;scanf("a=%f:b=%f:c=%f",&a,&b,c&);正确输入为:a=1:b=2:c=3)
    (6)%c:字符
    用"%c"格式声明输入字符时,空格字符和"转义字符"中的字符都作为有效字符输入。例如:scanf("%c%c%c",&c1,&c2,&c3);输入时为abc(中间不能有空格)当输入a b c(会把第一个字符'a'送给c1,第二个字符时空格字符' ',送给c2,第三个字符b送给c3)
    注意:在输入数据时,如输入空格、回车Tab键或非法字符(不属于数值的字符),认为该数据结束。例如scanf("%d%c%f",&a,&b,&c)若输入1234a123o.26;则会将1234给a,a给b,123给c,后边的无效。
    
  • getchar、putchar
    putchar的作用主要是向输出缓冲区中写入一个字符。
    getchar的作用主要是向输入缓冲区中读取一个字符。如果碰到文件结尾,返回-1
    getchar源代码

  int getchar(void){ 
  static char buf[BUFSIZ]; 
  static char* bb = buf; 
  static int n = 0; 
  if (n == 0) { 
  n = read(0, buf, BUFSIZ); 
  bb = buf; 
  } 
  return(--n >= 0) ? (unsigned char)*bb++ : EOF; 
  }

EOF是一个宏,表示-1。getchar的返回值是int,对于文件来说-1表示了文件的结尾。我们可以在键盘上利用Ctrl+Z来实现类似的效果。

从getchar的源代码中可以看出,如果发现字符数组buf已空(n0),则调用read方法从键盘读取数据(该方法会导致阻塞),并让指针指向数组的首地址。如果缓冲区还有字符没有被读取(n 0),则读取它,同时n-1,指针(bb)向后移动一位。当缓冲区已空(n0),且read函数读取失败时(读取到了文件末尾),返回EOF。

从scanf的源代码中可以看出getchar可以读入任何字符,包括空白符(空白符包括:空格、换行符、制表符等)。

  • gets、puts
    puts函数主要向输出缓冲区写入一个字符串,并再字符串输出结束以后,再额外输出一个换行符 ‘\n’。例如:char str[] = {“China”}; puts[str];在终端打印China.

    gets用于从输入流的缓冲区中读取字符到指定的数组。读取过程中会忽略所有的前导空白符,读入的第一个字符为非空白符,直到遇到换行符才停止读入,结束的换行符('\n')被gets函数读从缓冲区读取走了,存于数组中,然后被替换成'\0'。
    
    注意:,puts和gets只能输出或输入一个字符串,不能写成puts(str1,str2);
    gets 源代码(只需要看for循环这部分代码,FLOCKFILE(stdin)表示对输入缓冲区加锁对;FUNLOCKFILE(stdin) 表示对输入缓冲区解锁)。
    
char* gets(char *buf){ 
int c; 
char *s; 
static int warned; 
static const char w[] = "warning: this program uses gets(), which is unsafe.\n";
FLOCKFILE(stdin); ORIENT(stdin, -1); 
if (!warned) { 
(void)_write(STDERR_FILENO, w, sizeof(w) - 1);
warned = 1; 
} 
for (s = buf; (c = __sgetc(stdin)) != '\n';) 
if (c == EOF) 
if (s == buf) {
 FUNLOCKFILE(stdin); return (NULL); 
} else
break; 
else
*s++ = c; *s = 0; 
FUNLOCKFILE(stdin); return (buf); 
}
	从源代码可以看出,如果读入了'\n'则停止,并替换成'\0'

2、关系运算符和关系表达式

  • 关系表达式:
    • 用关系运算符将两个数值或数值表达式连接起来的式子,称为关系表达式。关系表达式的值是一个逻辑值,即"真"或"假"。例如:关系表达式"5==3"的值为"假",“5>=0"的值为真。在C的逻辑运算中,以"1"代表"真”,以"0"代表"假";若a=3,b=2,c=1;则关系表达式"a>b"的值为"真",表达式的值为1.关系表达式"(a>b)==c"的值为"真"(因为a>b的值为1,等于c的值),表达式的值为1.

3、逻辑运算符和逻辑表达式

  • 逻辑表达式
    • C编译系统在表示逻辑运算结果时,以数值1代表"真",以0代表"假",但在判断一个量是否为"真"时,以0代表"假",以非0代表"真"。即将一个非零的数值认为"真"。
    • 例如:若a=4;则!a的值为0.若a=4,b=5;则a&&b的值为1.

4、for语句
for(表达式1;表达式2;表达式3) 语句 注意,表达式123都可以省略。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值