首页

文章

printf和scanf的用法

发布网友 发布时间:2022-03-07 22:09

我来回答

5个回答

热心网友 时间:2022-03-07 23:39

Printf和Scan函数的使用方法

一 printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出

信息。在编写程序时经常会用到此函数。printf()函数的调用格式为:

printf("<格式化字符串>", <参量表>);

其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原

样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符,

用来确定输出内容格式。

参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出

参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则将会出现意想

不到的错误。

格式化字符串的格式是:

%[标志][输出最小宽度][.精度][长度]格式字符

1. 标志:标志字符为-、+、#、空格四种,其意义下表所示:

标志 意义

- 结果左对齐,右边填空格

+ 输出符号(正号或负号)

空格 输出值为正时冠以空格,为负时冠以负号

# 对c,s,d,u类无影响;对o类,在输出时加前缀o;对x类,在输出时加前缀0x;对e,g,f 类当结果有小数 时才给出小数点(??????)

例1:

#i nclude

main()

{

int a=100;

float b=123.255;

printf("a=%d ",a);

printf("a=d ",a);

printf("a=%-10d ",a);

printf("a=%+d ",a);

printf("a=% d ",a);

printf("a=%#o ",a);

printf("a=%#x ",a);

printf("b=%#f ",b);

}

运行结果

a=100

a= 100

a=100

a=+100

a= 100

a=0144

a=0x64

b=123.254997 (?????)

2.输出最小宽度:用十进制整数来表示输出的最少位数。(至少要输出这么多位!)

若实际位数多于定义的宽度:则按实际位数输出。

若实际位数少于定义的宽度:则右对齐,左边留空。

有负号,左对齐,右边留空

表示宽度的数字以0开始,则右对齐,左边留空。

例2 #i nclude

main()

{

int a=3456;

printf("a== ",a); //若实际位数多于定义的宽度:则按实际位数输出

printf("a=d ",a); //若实际位数少于定义的宽度:则右对齐,左边留空

printf("a=%-10d ",a); //若实际位数少于定义的宽度:有负号,左对齐,右边留空

printf("a=0d ",a); //若实际位数少于定义的宽度:表示宽度的数字以0开始,则右对齐,左边留空

printf("a=%-010d ",a); //左对齐,0无意义。

}

运行结果:

a=3456

a= 3456

a=3456

a=0000003456

a=3456

3.精度:精度格式符以“.”开头,后跟十进制整数。意义是:

如果输出数字,则表示小数的位数;若实际位数大于所定义的精度数,则四舍五入。若不足则补0;

如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。

例3:

#i nclude

main()

{

printf("%.3f ",12.3456);

printf("%.9f ",12.3456);

printf("%.3s ","abcdefg");

printf("%.9s ","abcdefg");

}

运行结果:

12.346 //四舍五入到小数点后三位

12.345600000 //不足补0

abc

abcdefg

4.长度:长度格式符为h,l两种,h表示按短整型量输出,l表示按长整型量输出?????

5.Turbo C2.0提供的格式字符如下:

━━━━━━━━━━━━━━━━━━━━━━━━━━

符号 作用

──────────────────────────

%c 单个字符

%d 十进制有符号整数

%e 以“科学记数法”的形式输出十进制的浮点数 如2.451e+02

%f 输出十进制浮点数,不带域宽时,保留6位小数

%g 选用e或f格式中较短的一个输出十进制浮点数,不输出无效零

%0 无输出无符号八进制整数

%p 指针的值

%s 输出字符串

%u 输出无符号十进制整数

%x, %X 输出无符号十六进制整数 (不输出前缀Ox)

━━━━━━━━━━━━━━━━━━━━━━━━━━

2. 一些特殊规定字符

━━━━━━━━━━━━━━━━━━━━━━━━━━

字符 作用

──────────────────────────

换行

f 清屏并换页

回车

Tab符

xhh 表示一个ASCII码用16进表示,

其中hh是1到2个16进制数

━━━━━━━━━━━━━━━━━━━━━━━━━━

使用这些转义字符时不需要加上%,可单独使用!

由本节所学的printf()函数, 并结合上一节学习的数据类型, 编制下面的程

序, 以加深对Turbo C2.0数据类型的了解。

例1

#i nclude

#i nclude

int main()

{

char c, s[20], *p;

int a=1234, *i;

float f=3.141592653589;

double x=0.12345678987654321;

p="How do you do";

strcpy(s, "Hello, Comrade");

*i=12;

c='x41';

printf("a=%d ", a);

printf("a=m ", a);

printf("a=d ", a);

printf("a=- ", a);

printf("*i=M ", *i);

printf("*i=%-4d ", *i);

printf("i=%p ", i);

printf("f=%f ", f);

printf("f=6.4f ", f);

printf("x=%lf ", x);

printf("x=.16lf ", x);

printf("c=%c ", c);

printf("c=%x ", c);

printf("s[]=%s ", s);

printf("s[]=%6.9s ", s);

printf("s=%p ", s);

printf("*p=%s ", p);

printf("p=%p ", p);

getch();

retunr 0;

}

其他需要注意的一些问题:

1.如果用浮点数表示字符或整型量的输出格式, 小数点后的数字代表最大宽度,

小数点前的数字代表最小宽度。

例如: %6.9s 表示显示一个长度不小于6且不大于9的字符串。若大于9, 则第9个字符以后的内容将被删除。

2.使用printf函数时还要注意一个问题,那就是输出表列中的求值顺序。不同的编译系统不一定相同,可以从左到右,也可从右到左。Turbo C是按从右到左进行的。请看下面两个例子:

例1

main(){

int i=8;

printf("%d %d %d %d %d %d ",++i,--i,i++,i--,-i++,-i--);

}

运行结果

8

7

7

8

-7

-8

例2

main(){

int i=8;

printf("%d ",++i);

printf("%d ",--i);

printf("%d ",i++);

printf("%d ",i--);

printf("%d ",-i++);

printf("%d ",-i--);

}

运行结果:

9

8

8

9

-8

-9

这两个程序的区别是用一个printf语句和多个printf 语句输出。但从结果可以看出是不同的。为什么结果会不同呢?就是因为printf函数对输出表中各量求值的顺序是自右至左进行的。在第一例中,先对最后一项“-i--”求值,结果为-8,然后i自减1后为7。 再对“-i++”项求值得-7,然后i自增1后为8。再对“i--”项求值得8,然后i再自减1后为7。再求“i++”项得7,然后i再自增1后为8。 再求“--i”项,i先自减1后输出,输出值为7。 最后才求输出表列中的第一项“++i”,此时i自增1后输出8。

但是必须注意,求值顺序虽是自右至左,但是输出顺序还是从左至右,因此得到的结果是上述输出结果。

补充:最近在调试程序时发现一段代码如下:

printf(sFormat,"%%0�",THE_NUMBER_LEN);

输出数组后发现sFormat =
d;其中宏THE_NUMBER_LEN定义的为4,发现如果需要通过在printf转化的数组中出现%,那么就使用%%来代替,且后面的所有字符都会直接放入sFormat数组中一直遇到新的%。只有碰到“%+特定字符”,才会把右边对应的变量放入进来。

例如: printf(sFormat,"ABC%%d%d%%s�bc",THE_NUMBER_LEN,6);输出为ABC�%s6abc;

还有就是发现如果是修改成%0�,输出的字符串就变成
�,这样我猜想就是在printf函数时,碰到第一个%0后知道再遇见下一个%前,如果中间没有特定字符d,s,e,f等,通通变成空格,而我在%中间增加两个的非特殊字符后,发现�前面的空格急剧增加,原因就不清楚。故两%之间不能增加其他非特殊字符。

二 Scan函数



scanf()函数是格式化输入函数, 它从标准输入设备(键盘) 读取输入的信息。

其调用格式为:

scanf("<格式化字符串>", <地址表>);

格式化字符串包括以下三类不同的字符;

1. 格式化说明符: 格式化说明符与printf()函数中的格式说明符基本相同。

2. 空白字符: 空白字符会使scanf()函数在读操作中略去输入中的一个或多

个空白字符。

3. 非空白字符: 一个非空白字符会使scanf()函数在读入时剔除掉与这个非

空白字符相同的字符。

注意:(1)地址表是需要读入的所有变量的地址, 而不是变量本身:

----如果是一般的变量,通常要在变量名前加上"&";但输出时是用变量名

----如果是数组,用数组名就代表了该数组的首地址;输出时也是用数组名

----如果是指针,直接用指针名本身,不要加上“*”;输出时也用该指针即可。

例1:

各个变量的地址之间同","分开。

main()

{

int i;

char *p, str[20];

scanf("%d", &i);

scanf("%s", p);

scanf("%s", str);

printf("i=%d ",i);

printf("%s ", p);

printf("%s ", str);

}

(2)scanf函数中是否包含空白/非空白字符导致输入格式的不同

如:scanf("%d,%d",&i,&j); scanf中有,所以输入的格式应该是5,6==>i=5,j=6

scanf("%d%d",&i,&j); 可以用空格或回车来分隔两个输入 如 5 6==>i=5,j=6

scanf("%d %d",&i,&j); 同上

(3) 实际使用scanf()函数时存在一个问题, 下面举例进行说明:

当使用多个scanf()函数连续给多个字符变量输入时, 例如:

main()

{

char c1, c2;

scanf("%c", &c1);

scanf("%c", &c2);

printf("c1 is %c, c2 is %c", c21, c2);

}

运行该程序, 输入一个字符A后回车 (要完成输入必须回车), 在执行scanf

("%c", &c1)时, 给变量c1赋值"A", 但回车符仍然留在缓冲区内, 执行输入语句

scanf("%c", &c2)时, 变量c2输出的是一空行, 如果输入AB后回车, 那么输出结

果为: c1 is A, c2 is B。

要解决以上问题, 可以在输入函数前加入清除函数fflush()( 这个函数的使

用方法将在本节最后讲述)。修改以上程序变成:

#i nclude

main()

{

char c1, c2;

scanf("%c", &c1);

fflush(stdin);

scanf("%c", &c2);

printf("c1 is %c, c2 is %c", c1, c2);

}

在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。

例如:scanf("%c%c%c",&a,&b,&c);

输入为:d e f

则把'd'赋予a, ' ' 赋予b,'e'赋予c。

只有当输入为: def

时,才能把'd'赋于a,'e'赋予b,'f'赋予c。

如果在格式控制中加入空格作为间隔,

如:scanf ("%c %c %c",&a,&b,&c);

则输入时各数据之间可加空格。

例4

main(){

char a,b;

printf("input character a,b ");

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

printf("%c%c ",a,b);

}

由于scanf函数"%c%c"中没有空格,输入M N,结果输出只有M。而输入改为MN时则可输出MN两字符。

(4)格式字符串的一般形式为:

%

[输入数据宽度][长度]类型

其中有方括号[]的项为任选项。各项的意义如下:

1)类型:表示输入数据的类型,其格式符和意义如下表所示。

格式 字符意义

d 输入十进制整数

o 输入八进制整数

x 输入十六进制整数

u 输入无符号十进制整数

f或e 输入实型数(用小数形式或指数形式)

c 输入单个字符

s 输入字符串

2)“*”符:用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值。

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

当输入为:1 2 3时,把1赋予a,2被跳过,3赋予b。

3)宽度:用十进制整数指定输入的宽度(即字符数)。

例如:

scanf("]",&a);

输入:12345678

只把12345赋予变量a,其余部分被截去。

又如:scanf("MM",&a,&b);

输入:12345678

将把1234赋予a,而把5678赋予b。

例:

main()

{

int a,b;

scanf("MM",&a,&b);

printf("a=%d,b=%d",a,b);

}

输入 12345 67890

运行结果 a=1234,b=5

4) 长度:长度格式符为l和h,l表示输入长整型数据(如%ld) 和双精度浮点数(如%lf)。h表示输入短整型数据。

使用scanf函数还必须注意以下几点:

1)scanf函数中没有精度控制,如:scanf("%5.2f",&a);是非法的。不能企图用此语句输入小数为2位的实数。

2)在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。

热心网友 时间:2022-03-08 00:57

printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出 信息。在编写程序时经常会用到此函数。printf()函数的调用格式为: printf("<格式化字符串>", <参量表>);
printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。在编写程序时经常会用到此函数。printf()函数的调用格式为: printf("<格式化字符串>", <参量表>)。

详细请参考:http://blog.sina.com.cn/s/blog_4df39b0f0100onvq.html

热心网友 时间:2022-03-08 02:31

printf是标准输出函数
scanf是标准输入函数
printf的格式为printf("输出内容");
scanf的格式为scanf("输入控制符",输入的变量地址);
&n表示变量n的地址 &表示取址符 用在变量前获得变量的地址
你写的这两句前面是显示please input the whole number of people:
后面是给变量n赋值

热心网友 时间:2022-03-08 04:23

printf就是输出的意思
第一句就是输出please input the whole number of people:
第二句就是输入,%d表示是整数,n为变量,
意思就是输入一个整数

热心网友 时间:2022-03-08 06:31

兄弟,好好学啊,这么基础的都不会
历史要怎么读,有啥诀窍 高中历史诀窍 年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 使用puppeteer实现将htmll转成pdf 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档 【译】将HTML转为PDF的几种实现方案 变形金刚08动画怎么样 变形金刚08动画的问题 变形金刚08动画日语版剧情介绍 高分!换显卡nvidia控制面板被我卸了,重新安装显卡驱动后没了nvidia控... 我的nvidia控制面板被卸载了 怎么找回啊 卸载后 这个画面看着很奇怪_百 ... 李卓彬工作简历 林少明工作简历 广东工业职业技术学院怎么样 郑德涛任职简历 唐新桂个人简历 土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 网络诈骗定罪标准揭秘 “流水不争先”是什么意思? mc中钻石装备怎么做 为什么我的MC里的钻石块是这样的?我想要那种。是不是版本的问题?如果是... 带“偷儿”的诗句 “君不见巴丘古城如培塿”的出处是哪里 带“奈何”的诗句大全(229句) 里翁行()拼音版、注音及读音 带“不虑”的诗句 “鲁肃当年万人守”的出处是哪里 无尘防尘棚 进出口报关流程,越详细越好。谢谢大家指教。 双线桥不是看化合价升多少就标多少的吗?为什么CL2+2KI=2KCL+I2中I失... scanf用法的问题 c语言中的scanf 函数的用法 c语言scanf中*的用法 关于scanf的用法 如何缩小特别大的excel表格? c语言scanf的用法, scanf函数的用法 c语言中scanf的用法 镜子用海绵胶粘在墙上怎么快速除掉 隔夜米饭怎么翻新 用泡沫双面胶粘在墙上的镜子怎么才能取下来? 镜子用双面胶粘玻璃上了,怎样分开 用泡沫双面胶粘在墙上的镜子怎么才能取下来 怎么删除iphone的订阅记录 如何取消iphone日历订阅 装修时镜子上沾胶印怎么处理? 镜子上有胶怎么去除 如何清除镜子上面以前粘的胶贴 WPS文字后面有阴影 怎么删除阴影 玻璃窗上的双面胶怎么去除 Scanf()函数的使用 c语言中的scanf的意思是什么,怎么使用? 用下面的scanf()函数输入数据 excel表格求和等于0,不是文本问题!!! 都说双面胶痕迹难清除!教你一招,轻松去除胶印不留痕迹,太棒了 为什么excel求和为0 双面胶怎么清理 汽车漆面的双面胶如何清除 excel如何在一列中提取不同数据 有谁知道双面胶的胶痕用什么方法能去掉? 如何去除家具上的双面胶胶痕? 鱼缸里得绿藻如何根除 黑板上双面胶的胶痕如何去除? 液晶屏上怎样清除双面胶 怎样去除仪表盘上的双面胶胶印 泡沫双面胶怎么去除 怎么去除粘在地板上的双面胶 如何把一个模糊的图片变成清晰的 模糊的图片怎么变清晰 万能恢复大师弹窗广告怎样彻底删除?
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com