Linux--C语言之输入输出函数及格式控制输出
文章目录
- 一、数据输入输出的概念及在C语言中的实现
- 二、 简单的格式输入与输出
- (一)用简单的printf函数输出数据
- 1.一般格式
- (1)格式控制:用一对双引号括起来,包括两种信息
- (2)输出列表:中的各项目指出了所要输出的内容,可以是常量、变量或表达式
- (3)例如:
- 2.基本的格式字符
- (二)用简单的scanf函数输入数据
- 1.scanf函数的一般格式
- (三) 较复杂的输入输出格式控制
- 1.输出数据格式控制
- (1)十进制形式
- (2)八进制形式
- (3)十六进制形式
- 说明:
- 2.字符型格式说明
- (1)字符char型
- (2)字符串
- 案例:字符串输出
- 3.实型格式说明符
- (1)十进制数形式
- (2)指数形式
- (3)%g或%G形式
- 4.顺序结构程序设计案例
- 案例1:输入三角形的三边长,求三角形的面积。
- 案例2:从键盘输入一个大写字母,要求用小写输出。
- 案例3:求解一元二次方程ax2+bx+c的根
一、数据输入输出的概念及在C语言中的实现
数据的输入与输出是相对于计算机而言的。其中:
1.从计算机向外部设备输送数据称为输出。通常输出设备包括:显示器、打印机等;
2.从外部设备向计算机输送数据称为输入。通常输入设备包括:键盘、鼠标、扫描仪等。
在C语言中,输入输出是用标准库函数中的输入、输出函数实现的
二、 简单的格式输入与输出
(一)用简单的printf函数输出数据
1.一般格式
printf("格式控制",输出列表);
说明:
(1)格式控制:用一对双引号括起来,包括两种信息
格式说明:由“%”和特定字符组成,如:%d、%c、%f等,是格式说明符,用于说明输出项目所采用的格式;
普通字符:作为说明性的文字、符号等,照原样显示。
(2)输出列表:中的各项目指出了所要输出的内容,可以是常量、变量或表达式
(3)例如:
printf("a=%d,b=%f\n",a,b);
2.基本的格式字符
(1)%d:按十进制整数数据的实际长度输出
(2)%c:仅输出一个字符
(3)%s:输出的结果是字符串,例如:printf(“%s\n”,“CHINA”); 输出结果是字符串CHINA
(4)%f:一小数形式输出一个实数(含单双精度数),整数部分全部输出,并输出六位小数
(5)%e或%E:以指数形式输出一个实数(含单双精度数),小数点前仅一位非数字,并输出六位小数
(二)用简单的scanf函数输入数据
1.scanf函数的一般格式
scanf("格式控制",地址列表);
作用:将从键盘输入的值存入内存中所占的存储单元里,存储单元由地址标识
说明:
(1)格式控制:的含义同printf函数,说明输入的数据应使用的的格式
(2)地址列表:是由若干个地址组成的,可以是变量的地址或字符串的首地址。&是取地址运算符,用于取出变量的地址
(3)与格式输出一样,在格式控制中,用于说明输入数据格式的格式说明符是以%开头,后面紧跟的是具体的格式。
(4)输入的数据可用空格、Tab键、回车键之任一种分开
注意:
(1)scanf函数中的“格式控制”后面应当是变量的地址,由取地址运算符和变量名共同组成,不能仅是变量名:
scanf("%f%d", &a,&b);
(2)如果“格式控制”中除了格式说明以外还有其它字符,则在输入数据时必须在对应位置输入与之相同的字符: 从键盘输入时必须输逗号: 3,4 ↲
scanf("%d,%d", &a,&b);
(3)用%c格式输入字符时,空格和转义字符都作为有效字符输入,应注意:只有输入:xyz ↲ 才能使a得到x,b得到y,c得到z
scanf("%c%c%c", &a,&b,&c);
(4) 在输入数值型数据时,遇到空格、回车、Tab键或遇非法输入,则认为该数据结束:
scanf("%d%c%f", &a,&b,&c);
(5)对于unsigned型变量所需的数据,可以用%u或%d格式输入。
(三) 较复杂的输入输出格式控制
说明:按指定格式输出数据的宽度、小数位数、上下行数据按小数点对齐、用八进制、十六进制输出等。
1.输出数据格式控制
(1)十进制形式
%d或%md:用于基本整型 int
%ld 或 %mld:用于长整型 long
%u 或 %mu:用于无符号基本整型 unsigned
%lu 或 %mlu:用于无符号长整型 unsigned long
(2)八进制形式
%o或%mo:用于基本整型 int
%lo 或 %mlo:用于长整型 long
(3)十六进制形式
%x 或 %mx :用于基本整型 int
%lx 或 %mlx:用于长整型 long
说明:
m表示输出的整型数据所占总宽度(即列数),其中:
当实际数据的位数不到m位时,数据前面将用空格补满;
若实际数据位数大于m,则以数据的实际位数为准进行输出。
注意:一个int型整数也可以%u格式输出,反之一个unsigned型整数也可以%d、%o、%x格式输出。按相互赋值的规则处理。
2.字符型格式说明
(1)字符char型
%mc:输出的字符占m列,如:
printf(“%3c”,’a’); // 实际输出为:a 注::表示空格
(2)字符串
%ms 输出的字符串占m列。若串长>m,全部输出;若串长<m,左面补空格。
%-ms 输出的字符串长<m,右面补空格%-m.ns 只取字符串前n个字符。
若n<m,右面补空格;若n>m,m自动取n值。
注意:
一个整数,只要其值在0~255范围内,也可以用“%c”格式使其按字符形式输出。
在输出前,系统会自动将该整数作为ASCII码转换成相应的字符;反之,一个字符也可以输出成一个整数。
案例:字符串输出
#include <stdio.h>int main(void)
{printf("%3s,%7s,%-5.3s,%.4s\n","CHINA","CHINA","CHINA","CHINA"); //运行结果:CHINA, CH, CHI, CHIN 注:表示空格return 0;
}
3.实型格式说明符
(1)十进制数形式
%m.nf 或 %-m.nf
(2)指数形式
%m.ne 或 %-m.ne
(3)%g或%G形式
根据数值的大小,自动选%f 或 %e中宽度较短的一种格式,不输出无意义的0。
说明:
在输出实型数据时,格式说明符中的m表示整个数据所占的宽度,n表示小数点后面所占的位数。
如果在小数点后取n位后,所规定的数据宽度m不够输出数据前面的整数部分(包括小数点),则按实际的位数进行输出。
需要指出的是,在C语言中,用于输出单精度实型数据与双精度实型数据格式说明符是一样的。
4.顺序结构程序设计案例
程序中所有语句都是按自上而下的顺序执行的,不发生跳转
案例1:输入三角形的三边长,求三角形的面积。
/*
**需求:输入三角形的三边长,求三角形的面积。分析:① 设输入的三边能构成三角形;② 求三角形面积的公式为S = sqrt(p(p−a)(p−b)(p−c)) 注:sqrt表示开根号③p = (a+b+c)/2.0
*/
#include <stdio.h>
#include <math.h>int main()
{//声明变量存储三角形的三条边和面积float a,b,c; //三边float p; // 半周长float s; // 面积//给出输出提示,从键盘录入三角形的三条边printf("请输入三角形的三条边:");scanf("%f %f %f",&a, &b, &c);//判断输入的三条边能否构成三角形if(a + b > c && a + c > b && b + c > a){//用海伦公式求解三角形的面积p = (a+b+c) / 2.0f;s = sqrt(p*(p-a)*(p-b)*(p-c));printf("三角形的面积为:%.2f\n",s);}else{printf("您输入的三条边不能构成三角形!\n")}return 0;
}
案例2:从键盘输入一个大写字母,要求用小写输出。
/*
**需求:从键盘输入一个大写字母,要求用小写输出。分析:大写字母与小写字母的ASCII码值相差32。对从键盘输入的大写字母加32即变为相应的小写字母。
*/
#include <stdio.h>int main(void)
{//声明c1、c2两个变量分别存放字母的大小写char C1,C2; //给出输入提示并从键盘录入一个大写字母printf("请输入一个大写英文字母:");scanf("%c",&c1);c2 = c1 + 32;printf("相应的小写字母为:%c\n",c2);return 0;
}
案例3:求解一元二次方程ax2+bx+c的根
/*
**需求:系数a、b、c从键盘输入;分析:①已知一元二次方程的根为:x1=(-b/2a+sqrt(b^2-4ac))/2a,x2=(-b/2a-sqrt(b^2-4ac))/2a;② 可将上式分解为两项:m=-b/2a,n=sqrt(b^2-4ac)/2a;③ 则:x1=m+n,x2=m-n;
*/
#include <stdio.h>
#include <math.h>int main(void)
{//声明变量存储一元二次方程系数float a,b,c;//声明变量存储一元二次方程的根以及判别式的绝对值和处理量float x1,x2,d,m,n;//输出提示信息并从键盘录入一元二次方程的三个系数printf("请输入一元二次方程的三个系数:");scanf("%f %f %f",&a, &b, &c);//计算根的判别式dd = b*b - 4*a*c; //d表示根的判别式,说明:d>0时,方程有两个不等的实根;d=0时,方程有两个相等的实根;d<0时,方程无实根。// 根据判别式的值判断方程根的情况if (d < 0){printf("方程没有实数根!\n");} else{// 计算方程的根m = -b / (2 * a);// 使用 fabs函数确保 d 为非负数n = sqrt(fabs(d)) / (2 * a); x1 = m + n;x2 = m - n;printf("x1=%.2f\nx2=%.2f\n",x1,x2);}return 0;
}