2024年7月26日 第10天
简单的格式输入与输出
printf()函数
1.格式:printf("格式控制",输出列表);
举例:printf("%d,%c",i,c)
;
-
格式控制:用一对双引号括起来,包括两种信息
-
格式说明:由"%"和特定字符组成,如:
%d、%c、%f等
,是格式说明符,用于说明输出项目所采用的格式; -
普通字符:作为说明性的文字、符号等,照原样显示出来。
-
-
输出表列:中的各项目指出了所要输出的内容,可是常量、变量或表达式。
-
举例:printf("a=%d b=%f\n",a,b) ;
2.基本的格式字符
-
%d
整型 int 按十进制整型数据的实际长度输出。 -
%c
字符型 char 仅输出一个字符 -
%s
字符串格式 -
%f
以小数形式输出一个实数(含单双精度数)。整数部分全部输出,并输出6位小数。 -
%e/%E
以科学计数法的方式将浮点数打印出来 以指数形式输出一个实数(含单双精度数)。小数点前仅1位非0数字,并输出6位小数。 -
%p
打印内存的地址
#include <stdio.h>
int main(void)
{
int a = 10;
float b = 10.0f;
double c = 10.0;
char d = 'A';
char *e = "hello";
printf("%d,%f,%lf,%c,%s\n",a,b,c,d,e);
printf("请输入:\n");
int d1;
char c1;
double f1;
scanf("%d %c %lf",&d1,&c1,&f1);// 地址列表
printf("\n%d,%c,%f\n",d1,c1,f1);// 变量列表
return 0;
}
/********************************************
输出结果:
10,10.000000,10.000000,A,hello
请输入:
12 A 25
12,A,25.000000
*********************************************/
scanf("%d,%c,%lf",&d1,&c1,&f1);// 地址列表
/********************************************
输出结果:
10,10.000000,10.000000,A,hello
请输入:
12,A,25.0
12,A,25.000000
*********************************************/
scanf函数
1.格式: scanf(“格式控制”,地址表列);
举例:scanf("%d",&a);
作用: 将从键盘输入的值存入内存中所占的存储单元里。存储单元由地址标识。
说明
“格式控制”的含义同printf函数,说明输入的数据应使用的格式。
“地址表列”是由若干个地址组成的,可以是变量的地址或字符串的首地址。&
是取地址运算符,用于取出变量的地址。
与格式输出一样,在格式控制中,用于说明输入数据格式的格式说明符总是以%开头,后面紧跟的是具体的格式。
#include <stdio.h>
void main()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d\n",a,b,c);
return 0;
}
/********************************
3 4 5
a=3,b=4,c=5
********************************/
/*输入的数据可用空格、Tab键、回车键之任一种分开
#include <stdio.h>
int main(void)
{
printf("请输入3个连续的字符:\n");
char a,b,c;
scanf("%c%c%c",&a,&b,&c);
printf("输出测试字符:%c,%c,%c\n",a,b,c);
return 0;
}
/*************************************
请输入3个连续的字符:
abc
输出测试字符:a,b,c
请输入3个连续的字符:
a,b,c
输出测试字符:a,,,b
请输入3个连续的字符:
a b c
输出测试字符:a, ,b
**************************************/
说明
⑴ scanf函数中的“格式控制”后面应当是变量的地址,由取地址运算符和变量名共同组成,不能仅是变量名:scanf("%f%d", &a,&b);
⑵ 如果“格式控制”中除了格式说明以外还有其它字符,则在输入数据时必须在对应位置输入与之相同的字符:scanf("%d,%d", &a,&b); 从键盘输入时必须输逗号: 3,4 ↲
⑶ 用%c格式输入字符时,空格和转义字符都作为有效字符输入,应注意:
scanf("%c%c%c", &a,&b,&c); 只有输入:xyz ↲ 才能使a得到x,b得到y,c得到z
⑷ 在输入数值型数据时,遇到空格、回车、Tab键或遇非法输入,则认为该数据结束: scanf("%d%c%f", &a,&b,&c); 若输入:1234a123o.26 1234->a a->b 123->c o->非法字符
⑸ 对于unsigned型变量所需的数据,可以用%u
或%d
格式输入。
较复杂的输入输出格式控制
按指定格式输出数据的宽度、小数位数、上下行数据按小数点对齐、用八进制、十六进制输出等。
输出数据格式控制
1.整型格式说明符
-
十进制形式
-
%d 或 %md
用于基本整型 int -
%ld 或 %mld
用于长整型 long -
%u 或 %mu
用于无符号基本整型 unsigned -
%lu 或 %mlu
用于无符号长整型 unsigned long
-
-
八进制形式
-
%o 或 %mo
用于基本整型 int -
%lo 或 %mlo
用于长整型 long
-
-
十六进制形式
-
%x 或 %mx
用于基本整型 int
-
%lx 或 %mlx
用于长整型 long
注意:m表示
输出的整型数据所占总宽度
(即列数),其中:当实际数据的位数不到m位时,数据前面将用空格补满;
若实际数据位数大于m,则以数据的实际位数为准进行输出。
一个int型整数也可以
%u
格式输出,反之一个unsigned型整数也可以%d、%o、%x
格式输出。按相互赋值的规则处理。 -
/*
复杂数据格式
*/
#include <stdio.h>
int main(void)
{
int num;
long lnum;
printf("请输入连续的两个整数:\n");
scanf("%d,%ld",&num,&lnum);
printf("int-八进制:%o,int-十进制:%d,int-十六进制:%x,int-十进制-限制列数:%5d\n",num,num,num,num);
printf("long-八进制:%lo,long-十进制:%ld,long-十六进制:%lx,long-十进制-限制列数:%5ld\n",lnum,lnum,lnum,lnum);
return 0;
}
/************************************************************************************************************
请输入连续的两个整数:
25,9999
int-八进制:31,int-十进制:25,int-十六进制:19,int-十进制-限制列数: 25
long-八进制:23417,long-十进制:9999,long-十六进制:270f,long-十进制-限制列数: 9999
************************************************************************************************************/
2.字符型格式说明符
-
字符char型
-
%mc
输出的字符占m列printf(“%3c”,’a’); 输出:a
-
-
字符串
-
%ms
输出的字符串占m列。若串长>m,全部输出;若串长<m,左面补空格。 -
%-ms
输出的字符串长<m,右面补空格 -
%-m.ns
只取字符串前n个字符。若n<m,右面补空格;若n>m,m自动取n值。
-
注意:一个整数,只要其值在0~255范围内,也可义用"%c"格式使其按字符形式输出。
在输出前,系统会自动将该整数作为ASCII码转换成相应的字符;反之,一个字符也可以输出成一个整数。
# include <stdio.h>
void main ( )
{
printf("%3s,%7.2s ,%-5.3s,%.4s\n","CHINA","CHINA", "CHINA", "CHINA");
}
/*******************************************
输出结果:
CHINA, CH, CHI, CHIN↲
*********************************************/
3.实型格式说明符
-
十进制数形式
%m.nf
或%-m.nf
-
指数形式
%m.ne
或%-m.ne
-
%g
或%G
形式 根据数值的大小,自动选%f 或 %e中宽度较短的一种格式,不输出无意义的0。
注意: 在输出实型数据时,格式说明符中的m表示整个数据所占的宽度,n表示小数点后面所占的位数。
如果在小数点后取n位后,所规定的数据宽度m不够输出数据前面的整数部分(包括小数点),则按实际的位数进行输出。
需要指出的是,在C语言中,用于输出单精度实型数据与双精度实型数据格式说明符是一样的。
# include <stdio.h>
void main ( )
{
float f=123.456;
printf("%f%10.2f%.2f%-10.2f\n",f,f,f,f,f);
}
/******************************************************************
输出结果是:
123.456001123.46123.46123.46 ↲
********************************************************************/
/****
*求3个圆的周长,输出结果时上下按小数点对齐,取两位小数。
*/
# include <stdio.h>
#define PI 3.1415926
void main ( )
{double r1=1.53,r2=21.83,r3=123.71,s1,s2,s3;
s1=2.0*PI*r1;
s2=2.0*PI*r2;
s3=2.0*PI*r3;
printf("r1=%10.2f\nr2=%10.2f\nr3=%10.2f\n",r1,r2,r3);
}
/***********************
输出结果是:
r1=1.53 ↲
r2=21.83 ↲
r3=123.71 ↲
***************************/
#include <stdio.h>
main()
{ double x=34.567;
printf("x=%f\n",x);
printf("x=%d\n",x);
printf("x=%d\n",(int)x);
}
/******************
输出结果为:
x=34.567000
x=27263
x=34
*******************/
/************************************************************************************************************************************
显然,这个程序中的第二个格式输出语句输出的结果是错误的,这是因为在第二个格式输出语句中,格式说明符%d是基本整型格式说明符,而输出项目是双精度型的数据,它们是不匹配的。
************************************************************************************************************************************/
输入数据格式控制
1.整型格式说明符
-
十进制形式
-
%d 或 %md
用于一般整型 int -
%ld 或 %mld
用于长整型 long -
%u 或 %mu
用于无符号基本整型 unsigned -
%lu 或 %mlu
用于无符号长整型 unsigned long
-
-
八进制形式
-
%o 或 %mo
用于基本整型 int -
%lo 或 %mlo
用于长整型 long
-
-
十六进制形式
-
%x 或 %mx
用于一般整型 int
-
%lx 或 %mlx
用于长整型 long
-
注意:用于输入与输出整型数据的格式说明符是完全一样的。
m表示输入数据时的宽度(即列数)。
与输出情形一样,对于八进制形式与十六进制形式的输入格式,主要用于输入无符号整型的数据。
2.实型格式说明符
单精度实 %f 或 %e
双精度实型 %lf
注意:与输出不同,输入时无论是单精度还是双精度实型,都不能用m.n来指定输出的宽度和小数点后的位数;
可以指定输入数据所占的列数,系统自动按它截取所需数据,如:scanf(“%3d%3d”,&a,&b)
; 当输入1234567时,a得到123,b得到456,多余的7无用;
若在%号后有一个""和一个数字,表示跳过它指定的列数,如:scanf(“%2d%3d%3d”,&a,&b);
当输入12345678时,a得到12, %3d表示读入345这3个数但不赋给变量, b得到678。
当用于输入整型数据的格式说明符中没有宽度说明时,则在具体输入
数据时分为以下两种情况:
① 如果各格式说明符之间没有其它字符,则在输入数据时,两个数据 之间用"空格"、或"Tab"、或"回车"来分隔。
② 如果各格式说明符之间包含其它字符,则在输入数据时,应输入与这些字符相同的字符作为间隔。
采用不同的格式说明,其输入数据的形式也是不同的。分别说明如下:
-
若输入语句为
scanf("%d%d%f%f",&a,&b,&c,&d)
;(即格式说明符中没有宽度说明,各格式说明符之间也没有其他字符。)
则输入数据的形式应为 12 78 12.5 7.6↲
(两个数据之间用空格来分隔,当然也可用“Tab”或“回车”来分隔。)
-
若输入语句为
scanf("%d,%d,%f,%f",&a,&b,&c,&d)
;(格式说明符中没有宽度说明,但各格式说明符之间有其它字符,即逗号)
则输入数据的形式应为 12,78,12.5,7.6↲
(即在输入的两个数据之间同时要输入逗号。)
-
若输入语句
scanf(“a=%d,b=%d,c=%f,d=%f”,&a,&b,&c,&d)
;(即格式说明符中没有宽度说明,但各格式说明符之间有其它字符。)
输入数据的形式应为 a=12,b=78,c=12.5,d=7.6↲
(即在输入的两个数据之间同时要输入这些非格式说明符的字符。)
在用于输入的实型格式说明符中不能用m.n来指定输入的宽度和小数点后的位数(这是与输出的不同之处)。
例如:scanf(“%7.2f”,&a);× 此用法是错误的
为了便于程序执行过程中从键盘输入数据,在一个C程序开始执行时,系统就在计算机内存中开辟了一个输入缓冲区,用于暂存从键盘输入的数据。开始时该输入缓冲区是空的。当执行到一个输入函数时,就检查输入缓冲区中是否有数据:
如果输入缓冲区中已经有数据(上一个输入函数剩下的),则依次按照“格式控制”中的格式说明符从输入缓冲区中取出数据转换成计算机中的表示形式(二进制),最后存放到内存地址表中指出的对应地址中。
顺序结构
程序中所有语句都是按自上而下的顺序执行的,不发生跳转
举例:
/*******************************************
输入三角形的三边长,求三角形的面积。
*********************************************/
#include <stdio.h>
#include <math.h>
void main()
{
float a,b,c,s,area;
scanf("%f,%f,%f",&a,&b,&c);
s=(a+b+c)/2.0;
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf("a=%f\nb=%f\nc=%f\narea=%f\n",a,b,c,area);
}
/************************************************
当输入:
3.4,4.5,5.6↲
运行结果为:
a=3.40
b=4.50
c=5.60
area=7.65
*****************************************************/
/********************************************************************************************
输出语句改为:printf("a=%7.2f\nb=%7.2f\nc=%7.2f\narea=%7.2f\n",a,b,c,area);
运行结果为:
a=3.400000
b=4.500000
c=5.600000
area=7.649173
**************************************************************************************************/
/****************************************************************************
求一元二次方程ax<sup>2</sup> + bx +c = 0的根。
要求:系数a、b、c从键盘输入;
*****************************************************************************/
#include <stdio.h>
#include <math.h>
void main ( )
{float a,b,c,disc,x1,x2,p,q;
scanf("a=%f,b=%f,c=%f",&a,&b,&c);
disc=b*b-4*a*c;
p=-b/(2*a);
q=sqrt(disc)/(2*a);
x1=p+q;x2=p-q;
printf("x1=%5.2f\nx2=%5.2f\n",x1,x2);
}
/*************************************************
输出结果:
a=1,b=3,c=2↲
运行结果为:
x1=-1.00
x2=-2.00
*************************************************/
以上是嵌入式学习第10天笔记,有什么问题还请指正,谢谢!