当前位置:文档之家› C语言scanf函数详细解释

C语言scanf函数详细解释

C语言scanf函数详细解释
C语言scanf函数详细解释

函数名: scanf

功能: 执行格式化输入

用法: int scanf(char *format[,argument,...]);

scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。

其调用格式为: scanf("<格式化字符串>",<地址表>);

scanf()函数返回成功赋值的数据项数,出错时则返回EOF。

其控制串由三类字符构成:

1。格式化说明符;

2。空白符;

3。非空白符;

(A)格式化说明符

格式字符说明

%a 读入一个浮点值(仅C99有效)

%A 同上

%c 读入一个字符

%d 读入十进制整数

%i 读入十进制,八进制,十六进制整数

%o 读入八进制整数

%x 读入十六进制整数

%X 同上

%c 读入一个字符

%s 读入一个字符串

%f 读入一个浮点数

%F 同上

%e 同上

%E 同上

%g 同上

%G 同上

%p 读入一个指针

%u 读入一个无符号十进制整数

%n 至此已读入值的等价字符数

%[] 扫描字符集合

%% 读%符号

附加格式说明字符表

修饰符说明

L/l 长度修饰符输入"长"数据

h 长度修饰符输入"短"数据

W 整型常数指定输入数据所占宽度

* 星号空读一个数据

hh,ll同上h,l但仅对C99有效。

(B)空白字符

空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符,空白符可以是space,tab,newline等等,直到第一个非空白符出现为止。

(C)非空白字符

一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。

注:scanf()控制串知识就介绍到这里(应该比较齐全了^_^),如有遗漏下次补上。下面将结合实际例程,一一阐述.

三、scanf()函数的控制串的使用

例1.

#include "stdio.h"

int main(void)

{

int a,b,c;

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

printf("%d,%d,%d/n",a,b,c);

return 0;

}

运行时按如下方式输入三个值:

3□4□5↙(输入a,b,c的值)

3,4,5 (printf输出的a,b,c的值)

(1)&a、&b、&c中的&是地址运算符,分别获得这三个变量的内存地址。(2)"%d%d%d"是按十进值格式输入三个数值。输入时,在两个数据之间可以用一个或多个空格、tab键、回车键分隔。

以下是合法输入方式:

①3□□4□□□□5↙

②3↙

4□5↙

③3(tab键)4↙

5↙

例2.

#include "stdio.h"

int main(void)

{

int a,b,c;

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

printf("%d,%d,%d/n",a,b,c);

return 0;

}

运行时按如下方式输入三个值:

3,4,5↙(输入a,b,c的值)

或者

3,□4,□5↙(输入a,b,c的值)

3,□□□4,□5↙(输入a,b,c的值)

......

都是合法的,但是","一定要跟在数字后面,如:

3□,4,□5↙就非法了,程序出错。(解决方法与原因后面讲)

再如:

1、sacnf()中的变量必须使用地址。

int a, b;

scanf("%d%d",a,b); //错误

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

2、scanf()的格式控制串可以使用其它非空白字符,但在输入时必须输入这些字符。例:

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

输入:3,4 ↙(逗号与"%d,%d"中的逗号对应)

scanf("a=%d,b=%d",&a,&b);

输入:a=3,b=4 ↙("a=","b=",逗号与"%d,%d"中的"a=","b="及逗号对应)

3、在用"%c"输入时,空格和“转义字符”均作为有效字符。

例:

scanf("%c%c%c",&c1,&c2,&c3);

输入:a□b□c↙

结果:a→c1,□→c2,b→c3 (其余被丢弃)

scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结束)。

①遇空格、“回车”、“跳格”键。

②遇宽度结束。

③遇非法输入。

问题二:scanf()函数不能正确接受有空格的字符串?如: I love you!

#include

int main()

{

char str[80];

scanf("%s",str);

printf("%s",str);

return 0;

}

输入:I live you!

输出:I

scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf

函数,scanf函数仅在每一个数据域均有数据,并按回车后结束)。

①遇空格、“回车”、“跳格”键。

②遇宽度结束。

③遇非法输入。

所以,上述程序并不能达到预期目的,scanf()扫描到"I"后面的空格就认为对str的赋值结束,并忽略后面的"love you!".这里要注意是"love you!"还在键盘缓冲区(关于这个问题,网上我所见的说法都是如此,但是,我经过调试发现,其实这时缓冲区字符串首尾指针已经相等了,也就是说缓冲区清空了,scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中)。我们改动一下上面的程序来验证一下:

#include

int main()

{

char str[80];

char str1[80];

char str2[80];

scanf("%s",str);/*此处输入:I love you! */

printf("%s",str);

sleep(5);/*这里等待5秒,告诉你程序运行到什么地方*/

scanf("%s",str1);/*这两句无需你再输入,是对键盘盘缓冲区再扫描*/

scanf("%s",str2);/*这两句无需你再输入,是对键盘盘缓冲区再扫描*/

printf("/n%s",str1);

printf("/n%s",str2);

return 0;

}

输入:I love you!

输出:I

love

you!

好了,原因知道了,那么scanf()函数能不能完成这个任务?回答是:能!别忘了scanf()函数还有一个%[] 格式控制符(如果对%[]不了解的请查看本文的上篇),请看下面的程序:#include "stdio.h"

int main()

{

char string[50];

/*scanf("%s",string);不能接收空格符*/

scanf("%[^/n]",string);

printf("%s/n",string);

return 0;

}

问题三:键盘缓冲区残余信息问题

#include

int main()

{

int a;

char c;

do

{

scanf("%d",&a);

scanf("%c",&c);

printf("a=%d c=%c/n",a,c);

/*printf("c=%d/n",c);*/

}while(c!='N');

}

scanf("%c",&c);这句不能正常接收字符,什么原因呢?我们用printf("c=%d/n",c);将C用int 表示出来,启用printf("c=%d/n",c);这一句,看看scanf()函数赋给C到底是什么,结果是c=10 ,ASCII值为10是什么?换行即/n.对了,我们每击打一下"Enter"键,向键盘缓冲区发去一个“回车”(/r),一个“换行"(/n),在这里/r被scanf()函数处理掉了(姑且这么认为吧^_^),而/n被scanf()函数“错误”地赋给了c.

解决办法:可以在两个scanf()函数之后加个fflush(stdin);,还有加getch(); getchar();也可以,但是要视具体scanf()语句加那个,这里就不分析了,读者自己去摸索吧。但是加fflush(stdin);不管什么情况都可行。

函数名: fflush

功能: 清除一个流

用法: int fflush(FILE *stream);

#include

int main()

{

int a;

char c;

do

{

scanf("%d",&a);

fflush(stdin);

scanf("%c",&c);

fflush(stdin);

printf("a=%d c=%c/n",a,c);

}while(c!='N');

}

这里再给一个用“空格符”来处理缓冲区残余信息的示例:

运行出错的程序:

#include

int main()

{

int i;

char j;

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

{

scanf("%c",&j);/*这里%前没有空格*/

}

}

使用了空格控制符后:

#include

int main()

{

int i;

char j;

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

{

scanf(" %c",&j);/*注意这里%前有个空格*/

}

}

可以运行看看两个程序有什么不同。

问题四如何处理scanf()函数误输入造成程序死锁或出错?#include

int main()

{

int a,b,c; /*计算a+b*/

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

c=a+b;

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

}

如上程序,如果正确输入a,b的值,那么没什么问题,但是,你不能保证使用者每一次都能正确输入,一旦输入了错误的类型,你的程序不是死锁,就是得到一个错误的结果,呵呵,这可能所有人都遇到过的问题吧?

解决方法:scanf()函数执行成功时的返回值是成功读取的变量数,也就是说,你这个scanf()函数有几个变量,如果scanf()函数全部正常读取,它就返回几。但这里还要注意另一个问题,如果输入了非法数据,键盘缓冲区就可能还个有残余信息问题。

正确的例程:

#include

int main()

{

int a,b,c; /*计算a+b*/

while(scanf("%d,%d",&a,&b)!=2)fflush(stdin);

c=a+b;

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

}

scanf函数探讨

1.空白符问题

#include

main()

{

int a;

printf( "input the data/n ");

scanf( "%d/n ",&a);//这里多了一个回车符/n

printf( "%d ",a);

return 0;

}

结果要输入两个数程序才结束,而不是预期的一个。why?

原因:用空白符结尾时,scanf会跳过空白符去读下一个字符,所以你必须再输入一个数。这里的空白符包括

空格,制表符,换行符,回车符和换页符。所以如果你用scanf( "%d ",&a)也会出现同样的

问题。

解决方法:这种错误大多是输入的时候不小心,多注意一点就好了。这种问题也不好检查,编译没有问题,

一个空格也不容易看出来。当你的程序出现上面的问题时,自己对照检查一下就可以了。

2.缓冲区问题

这是一个非常容易错的地方,我就错过多次。

#include

main()

{

int n = 5;

char c[n];

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

c[i] = scanf( "%c ",&c[i]);

printf(c);

return 0;

}

如果输入:

a

b

c

那么循环就会“提前”结束了.

原因:输入a和第一个回车后,a和这个回车符都留在缓冲区中。第一个scanf读取了a,但是输入缓冲区里面

还留有一个/n,第二个scanf读取这个/n。然后输入b和第二个回车,同样的,第三个scanf 读取了b,第四个

scanf读取了第二个回车符。第五个读取了c。所以五个scanf都执行了,并没有提前结束。只不过有的scanf

读取到了回车符而已。

解决方法:把程序改成这样就可以了:

for( i = 0; i < n; i++){

scanf( "%c ",&c[i]);

fflush(stdin);//刷新缓冲区

}

或者不用scanf,而用gets()函数,如:

#include

main()

{

char c[5];

gets(c);

printf(c);

return 0;

}

但要注意:这个函数自动把你最后敲的回车转换为字符'/0 '。如果你的输入超过了数组的大小,那么就会产

生错误。

3.scanf()函数的参数输入类型不匹配问题

这是我在csdn论坛上见到的问题,这个错误有时候会让人莫名其妙。

#include

main()

{

int a=123;

char c= 't ';

printf( "input/n ");

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

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

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

printf( "%d/n%c/n ",a,c);

return 0;

}

当输入a 回车后,会直接跳过下面2个scanf语句,直接输出为

123

t

原因:对于scanf( "%d%c ",&a,&c),scanf语句执行时,首先试图从缓冲区中读入一个%d 类型的数据,如果和

第一个参数匹配,则继续从缓冲区中读取数据和第二个参数进行匹配,依次进行下去,直到匹配完所有的参

数;如果其中有一个参数不匹配,那就从这个地方跳出,忽略这个scanf后面所有的参数,而去执行下一条语

句。

可以用下面的程序验证一下:

#include

int main()

{

int a=123,b=1;

char c= 't ';

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

scanf( "%c ",&c);

printf( "%d/n%d/n%c/n ",a,b,c);

return 0;

}输入:2 回车a 回车

结果是:

2

1

a

解决方法:scanf()函数执行成功时的返回值是成功读取的变量数,也就是说,你这个scanf()函数有几个变量

,如果scanf()函数全部正常读取,它就返回几。但这里还要注意另一个问题,如果输入了非法数据,键盘缓

冲区就可能还个有残余信息问题。

比如:

#include

main()

{

int a=123,b;

while(scanf( "%d%d ",&a,&b)!=2)

fflush(stdin);

printf( "%d/n%d/n ",a,b);

return 0;

}

你可以试一下,如果输入不是数字时,会有什么反应。

补充:scanf中一种很少见但很有用的转换字符:[...]和[ ^...]。

#include

main()

{

char strings[100];

scanf( "%[1234567890] ",strings);

printf( "%s ",strings);

return 0;

}

运行,输入:1234werew后,结果是:1234。

通过运行可以发现它的作用是:如果输入的字符属于方括号内字符串中某个字符,那么就提取该字符;如果

一经发现不属于就结束提取。该方法会自动加上一个字符串结束符到已经提取的字符后面。scanf( "%[^1234567890] ",strings); 它的作用是:如果一经发现输入的字符属于方括号内字符串中某个字符

,那么就结束提取;如果不属于就提取该字符。该方法会自动加上一个字符串结束符到已经提取的字符后面

注意:方括号两边不能空格,如:scanf( "%[ 1234567890 ] ",strings);

scanf( "%[ ^1234567890

] ",strings); 不让空格也会算在里面的。

用这种方法还可以解决scanf的输入中不能有空格的问题。只要用

scanf( "%[^/n] ",strings); 就可以了。很神奇吧。

scanf原型:参见《C语言大全》和K&C

# include ;

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

函数scanf() 是从标准输入流stdin 中读内容的通用子程序,可以读入全部固有类型的数据并自动转换成机内形式。

在C99 中,format 用restrict 修饰。

format 指向的控制串由以下三类字符组成:

● 格式说明符

● 空白符

● 非空白符

转换字符(就是%后跟的部分)

a 读浮点值(仅适用于C99)

A 读浮点值(仅适用于C99)

c 读单字符

d 读十进制整数

i 读十进制、八进制、十六进制整数

e 读浮点数

E 读浮点数

f 读浮点数

F 读浮点数(仅适用于C99)

g 读浮点数

G 读浮点数

o 读八进制数

s 读字符串

x 读十六进制数

X 读十六进制数

p 读指针值

n 至此已读入值的等价字符数

u 读无符号十进制整数

[ ] 扫描字符集合

% 读% 符号(百分号)

例如:%s 表示读串而%d 表示读整数。格式串的处理顺序为从左到右,格式说明符逐一与变元表中的

变元匹配。为了读取长整数,可以将l(ell) 放在格式说明符的前面;为了读取短整数,可以将h 放在格式

说明符的前面。这些修饰符可以与d、i、o、u 和x 格式代码一起使用。

默认情况下,a、f、e 和g 告诉scanf() 为float 分配数据。如果将l(ell) 放在这些修饰符的前

面,则scanf() 为double 分配数据。使用L 就是告诉scanf(),接收数据的变量是long double 型变量。

如果使用的现代编译器程序支持1995 年增加的宽字符特性,则可以与c 格式代码一起,用l 修饰符

说明类型wchar_t 的宽字符指针;也可以与s 格式代码一起,用l 修饰符说明宽字符串的指针。l 修饰符

也可以用于修饰扫描集,以说明宽字符。

控制串中的空白符使scanf() 在输入流中跳过一个或多个空白行。空白符可以是空格(space)、制表符

(tab)和新行符(newline)。本质上,控制串中的空白符使scanf() 在输入流中读,但不保存结果,直到发

现非空白字符为止。

非空白符使scanf() 在流中读一个匹配的字符并忽略之。例如,"%d,%d " 使scanf() 先读入一个整数

,读入中放弃逗号,然后读另一个整数。如未发现匹配,scanf() 返回。

scanf() 中用于保存读入值的变元必须都是变量指针,即相应变量的地址。

在输入流中,数据项必须由空格、制表符和新行符分割。逗号和分号等不是分隔符,比如以下代码:

scanf( "%d %d ", &r, &c );

将接受输入10 20,但遇到10,20 则失败。

百分号(%)与格式符之间的星号(*)表示读指定类型的数据但不保存。因此,

scanf( "%d %*c %d ", &x, &y );

对10/20 的读入操作中,10 放入变量x,20 放入y。

格式命令可以说明最大域宽。在百分号(%)与格式码之间的整数用于限制从对应域读入的最大字符数。

例如,希望向address 读入不多于20 个字符时,可以书写成如下形式:

scanf( "%20s ", address );

如果输入流的内容多于20 个字符,则下次scanf() 从此次停止处开始读入。若达到最大域宽前已遇

到空白符,则对该域的读立即停止;此时,scanf() 跳到下一个域。

虽然空格、制表符和新行符都用做域分割符号,但读单字符操作中却按一般字符处理。例如,对输入流

"x y " 调用:

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

返回后,x 在变量a 中,空格在变量b 中,y 在变量c 中。

注意,控制串中的其它字符,包括空格、制表符和新行符,都用于从输入流中匹配并放弃字符,被匹配

的字符都放弃。例如,给定输入流"10t20 ",调用:

scanf( "%dt%d ", &x, &y );

将把10 和20 分别放到x 和y 中,t 被放弃,因为t 在控制串中。

ANSI C 标准向scanf() 增加了一种新特性,称为扫描集(scanset)。扫描集定义一个字符集合,可由

scanf() 读入其中允许的字符并赋给对应字符数组。扫描集合由一对方括号中的一串字符定义,左方括号前

必须缀以百分号。例如,以下的扫描集使scanf() 读入字符A、B 和C:

%[ABC]

使用扫描集时,scanf() 连续吃进集合中的字符并放入对应的字符数组,直到发现不在集合中的字符为

止(即扫描集仅读匹配的字符)。返回时,数组中放置以null 结尾、由读入字符组成的字符串。

用字符^ 可以说明补集。把^ 字符放为扫描集的第一字符时,构成其它字符组成的命令的补集合,指

示scanf() 只接受未说明的其它字符。

对于许多实现来说,用连字符可以说明一个范围。例如,以下扫描集使scanf() 接受字母A 到Z:

%[A-Z]

重要的是要注意扫描集是区分大小写的。因此,希望扫描大、小写字符时,应该分别说明大、小写字母

scanf() 返回等于成功赋值的域数的值,但由于星号修饰符而读入未赋值的域不计算在内。给第一个域

赋值前已出错时,返回EOF。

C99 为scanf() 增加了几个格式修饰符:hh、ll、j、z 和t。hh 修饰符可用于d、i、o、u、

n。它说明相应的变元是signed 或unsigned char 值,或用于n 时,相应的变元是指向long char 型变

量的指针。ll 修饰符也可用于d、i、o、u、x、X 或n。它说明相应的变元是signed 或者unsigned long

long int 值。

j 格式修饰符应用于d、i、o、u、x、X 或n,说明匹配的变元是类型intmax_t 或uintmax_t。这些

类型在 ; 中声明,并说明最大宽度的整数。

z 格式修饰符应用于d、i、o、u、x、X 或n,说明匹配的变元是指向size_t 类型对象的指针。该类

型在 ; 中声明,并说明sizeof 的结构。

t 格式修饰符应用于d、i、o、u、x、X 或n,说明匹配的变元是指向ptrdiff_t 类型对象的指针。

该类型在 ; 中声明,并说明两个指针之间的差别。

例子:

# include ;

int main( void )

{

char str[80], str2[80];

int i;

/* read a string and a integer */

scanf( "%s%d ", str, &i );

/* read up to 79 chars into str */

scanf( "%79s ", str );

/* skip the integer between the two strings */

scanf( "%s%*d%s ", str, str2 );

}你的问题在这个部分:

3.scanf()函数的参数输入类型不匹配问题

这是我在csdn论坛上见到的问题,这个错误有时候会让人莫名其妙。

#include

main()

{

int a=123;

char c= 't ';

printf( "input/n ");

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

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

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

printf( "%d/n%c/n ",a,c);

return 0;

}

当输入a 回车后,会直接跳过下面2个scanf语句,直接输出为

123

t

原因:对于scanf( "%d%c ",&a,&c),scanf语句执行时,首先试图从缓冲区中读入一个%d 类型的数据,如果和

第一个参数匹配,则继续从缓冲区中读取数据和第二个参数进行匹配,依次进行下去,直到匹配完所有的参

数;如果其中有一个参数不匹配,那就从这个地方跳出,忽略这个scanf后面所有的参数,而去执行下一条语

句。

可以用下面的程序验证一下:

#include

int main()

{

int a=123,b=1;

char c= 't ';

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

scanf( "%c ",&c);

printf( "%d/n%d/n%c/n ",a,b,c);

return 0;

}输入:2 回车a 回车

结果是:

2

1

a

解决方法:scanf()函数执行成功时的返回值是成功读取的变量数,也就是说,你这个scanf()函数有几个变量

,如果scanf()函数全部正常读取,它就返回几。但这里还要注意另一个问题,如果输入了非法数据,键盘缓

冲区就可能还个有残余信息问题。

比如:

#include

main()

{

int a=123,b;

while(scanf( "%d%d ",&a,&b)!=2)

fflush(stdin);

printf( "%d/n%d/n ",a,b);

return 0;

}

scanf用法

scanf()函数是所有C语言学习者在学习C语言过程中所遇到的第二个函数(第一个函数是printf(),Brian W.Kerninghan & Dennis M.Ritchie的“hello,world”程序基本上是所有的C语言学习者第一个范例),所以scanf()函数应当是C学习者能熟练运用的一个函数,但有很多初学者对此函数不能很好的运用,在实际编程中错误使用scanf()函数,导至程序产生某种错误不能正常运行,以至产生“scanf()函数有BUG”,“scanf()函数无用论”等等错误观点。 本文结合笔者在编程实践中及论坛上网友所遇到的问题作一释疑,但笔者水平有限(菜鸟级),难免有谬误之处,还望达人指点一二。(Email:knocker.k@https://www.doczj.com/doc/ad11535816.html,) 本文分上,下两篇讲述了C语言中的scanf()函数的用法,重点阐述使用scanf()函数过程中出现的常见错误及对策。当然,文中某些解决方法,均可以采用其他函数和方法来更好地解决,但本文仅限讨论scanf()函数本身。 上篇,详细介绍了scanf()函数控制串的构成。下篇,用实际例程介绍scanf()函数控制串运用出现的常见错误及对策技巧。 二、scanf()函数的控制串 函数名: scanf 功能: 执行格式化输入 用法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。 其调用格式为: scanf("<格式化字符串>",<地址表>); scanf()函数返回成功赋值的数据项数,出错时则返回EOF。 其控制串由三类字符构成: 1。格式化说明符; 2。空白符; 3。非空白符; (A)格式化说明符

C语言输入输出函数格式详解

1、输入和输出: 输入:输入也叫读,数据由内核流向用户程序 输出:输出也称写、打印,数据由用户程序流向内核 以下介绍一些输入输出函数,尽管都是一些有缺陷的函数,但比较适合初学者使用 2、printf用法(其缺陷在于带缓存) printf输出时必须加上\n(刷新缓存) 解释:第一幅图没有加'\n',不会刷新缓存区,则不会打印出来;第二幅图是因为主函数结束时刷新了缓存区,但由于没有换行符,所以没有换行便显示了后面的内容;第三幅图时正常打印。 变量定义的是什么类型,在printf打印时就需要选择什么格式符,否则会造成数据的精度丢失(隐式强转),甚至会出现错误

(1)格式输出函数的一般形式 函数原型:intprintf(char * format[,argument,…]); 函数功能:按规定格式向输出设备(一般为显示器)输出数据,并返回实际输出的字符数,若出错,则返回负数。 A、它使用的一般形式为:printf("格式控制字符串",输出项列表); B、语句中"输出项列表"列出要输出的表达式(如常量、变量、运算符表达式、函数返回值等),它可以是0个、一个或多个,每个输出项之间用逗号(,)分隔;输出的数据可以是整数、实数、字符和字符串。 C、"格式控制字符串"必须用英文的双引号括起来,它的作用是控制输出项的格式和输出一些提示信息,例如:

inti=97; printf("i=%d,%c\n",i,i);输出结果为:i=97,a 语句printf("i=%d,%c\n",i,i);中的两个输出项都是变量i,但却以不同的格式输出,一个输出整型数97,另一个输出的却是字符a,其格式分别由"%d"与"%c"来控制。 语句printf("i=%d,%c\n",i,i);的格式控制字符串中"i="是普通字符,他将照原样输出;"%d"与"%c"是格式控制符;"\n"是转义字符,它的作用是换行。 (2)格式控制 格式控制由格式控制字符串实现,格式控制字符串由3部分组成:普通字符、转义字符、输出项格式说明。 A、普通字符。普通字符在输出时,按原样输出,主要用于输出提示信息。(空格属于普通字符) B、转义字符。转义字符指明特定的操作,如"\n"表示换行,"\t"表示水平制表等。 \n 换行 \f 清屏并换页 \r 回车 \tTab符 \xhh表示一个ASCII码用16进表示,其中hh是1到2个16进制数 C、格式说明部分由"%"和"格式字符串"组成,他表示按规定的格式输出数据。格式说明的形式为:% [flags] [width] [.prec] [F|N|h|l] type||%[标志][输出最少宽度][.精度][长度]类型 各部分说明如下: a、[]表示该项为可选项,即可有可无,如printf("%d",100); b、%:表示格式说明的起始符号,不可缺少。 c、flags为可选择的标志字符,常用的标志字符有: - ——左对齐输出,默认为右对齐输出 + ——正数输出加号(+),负数输出减号(-),如省略正数的+默认不显示 0 ——输出数值时指定左面不使用的空位置自动填0,如省略表示指定空位不填 # ——对c、s、d、u类无影响;对o类,在输出时加前缀0(数字0,八进制表示符);对x类,在输出时加前缀0x(字母为小写);对X类,在输出时加前缀0X(字母为大写);对e,g,f类当结果有小数时才给出小数点。 d、width为可选择的宽度指示符。 用十进制正整数表示设置输出值得最少字符个数。不足则补空格,多出则按实际输出,默认按实际输出,例如: printf("%8d\n",100); (前面空五格)100 printf("%08d\n",100); (前面5个0)100 printf("%6d\n",100); (前面空三格)100 printf("%-8d\n",100); 100(后面空五格) printf("%+8\n",100); (前面空四格)+100 e、[.prec]为可选的精度指示符 用“小数点”加“十进制正整数”表示,对“整数”、“实数”和“字符串”的输出有如下

C语言输入输出函数printf与scanf的用法格式

C 语言输入输出函数printf 与scanf 的用法格式 printf()函数用来向标准输出设备(屏幕)写数据; scanf() 函数用来从标准输入设备(键盘)上读数据。下面详细介绍这两个函数的用法。 一、printf()函数 printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。在编写程序时经常会用到此函数。printf()函数的调用格式为: printf("<格式化字符串>", <参量表>); 其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式控制字符, 以"%"开始, 后跟一个或几个控制字符,用来确定输出内容格式。 参量表是需要输出的一系列参数,可以是常量、变量或表达式,其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则将会出现意想不到的错误。 例如: printf("a=%d b=%d",a,b); 1. 格式控制符Turbo C 2.0提供的格式化规定符如下: 格式控制字符 参量表 正常字符

━━━━━━━━━━━━━━━━━━━━━━━━━━ 符号作用 ────────────────────────── %d 十进制有符号整数 %u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %e,%E 指数形式的浮点数 %x, %X 无符号以十六进制表示的整数 %o 无符号以八进制表示的整数 %g,%G 自动选择合适的表示法 ━━━━━━━━━━━━━━━━━━━━━━━━━━ printf的附加格式说明字符 字符说明 l 用于长整型数或双精度实型,可加在格式 符d、o、x、u和f前面 m(代表一个正整数据最小输出显示宽度

C语言格式输入函数scanf

C语言格式输入函数scanf()详解标题 scanf函数称为格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。 一、scanf函数的一般形式 scanf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中,与printf函数相同,C语言也允许在使用scanf函数之前不必包含stdio.h文件。scanf函数的一般形式为: scanf(“格式控制字符串”,地址表列); 其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。地址表列中给出各变量的地址。地址是由地址运算符“&”后跟变量名组成的。 例如:&a, &b 分别表示变量a和变量b 的地址。 这个地址就是编译系统在内存中给a,b变量分配的地址。在C语言中,使用了地址这个概念,这是与其它 语言不同的。应该把变量的值和变量的地址这两个不同的概念区别开来。变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。 变量的地址和变量值的关系如下: 在赋值表达式中给变量赋值,如: a=567 则,a为变量名,567是变量的值,&a是变量a的地址。 但在赋值号左边是变量名,不能写地址,而scanf函数在本质上也是给变量赋值,但要求写变量的地址, 如&a。这两者在形式上是不同的。&是一个取地址运算符,&a是一个表达式,其功能是求变量的地址。 【例4.7】 main(){ inta,b,c; printf("input a,b,c\n"); scanf("%d%d%d",&a,&b,&c); printf("a=%d,b=%d,c=%d",a,b,c); } 在本例中,由于scanf函数本身不能显示提示串,故先用printf语句在屏幕上输出提示,请用户输入a、b、c的值。执行scanf语句,则退出TC屏幕进入用户屏幕等待用户输入。用户输入7 8 9后按下回车键,此时,系统又将返回TC屏幕。在scanf语句的格式串中由于没有非格式字符在“%d%d%d”之间作输入时的间隔,因此在输入时要用一个以上的空格或回车键作为每两个输入数之间的间隔。如: 7 8 9

格式化输入、输出函数

格式化输入/输出函数 格式输出函数(printf) 格式字符表 格式字符说明 d或i 以十进制形式输出带符号整数(正数不输出符号) o 以八进制形式输出无符号整数(不输出前缀0) x,X 以十六进制形式输出无符号整数(不输出前缀0x),对于x用abcdef输出;对于X用ABCDEF输出 u 以十进制形式输出无符号整数 f 以小数形式输出单、双精度实数,隐含输出6位小数 e,E 以指数形式输出单、双精度实数,数字部分小数位数为6位小数,指数部分占5位,用“E”时,指数以大写表示 g,G 以%f或%e中较短的输出宽度输出单、双精度实数,不输出无意义的0,用“G” 时,则指数以大写表示 c 输出单个字符 s 输出字符串 p 输出标量的内存地址 未指定宽度和指定输出宽度时的输出结果 输出语句输出结果 printf(“%3d\n”,4321); 4321(按实际位数输出) printf(“%f\n”,123.54); 123.540000(按实际需要宽度输出) printf(“%12f\n”,123.54); 凵凵123.540000(输出右对齐,左边填空格) printf(“%e\n”,123.54); 1.235400e+002(按实际需要宽度输出) printf(“%14e\n”,1213.54); 凵1.235400e+002(输出右对齐,左边填空格) printf(“%g\n”,123.5); 123.5(%f格式比采用%e格式输出宽度小) printf(“%8g\n”,123.5); 凵凵凵123.5(输出右对齐,左边填空格) 指定精度时的输出结果 输出语句输出结果 printf(“%8.3f\n”,123.55); 凵123.550 printf(“%8.1f\n”,123.55); 凵凵凵123.6 printf(“%8.0f\n”,123.55); 凵凵凵凵凵124 printf(“%g\n”,123.56789); 123.568 printf(“%.7g\n”,123.56789); 123.5679 printf(“%.5s\n”,”abcdefg”); abcde 注:在VC中float类型有7位有效数字,double类型有16位有效数字

自己写的printf()和scanf()函数

自己来写printf()和scanf()函数 一、预备知识——C语言中的可变参数函数 1.先举一个例子: #define bufsize 80 char buffer[bufsize]; /**************************************************************** * 这个函数用来格式化带参数的字符串 *****************************************************************/ int vspf(char *fmt, ...) { va_list argptr; //声明一个转换参数的变量 int cnt; va_start(argptr, fmt); //初始化变量 //将带参数的字符串按照参数列表格式化到buffer中 cnt = vsnprintf(buffer,bufsize ,fmt, argptr); va_end(argptr); //结束变量列表,和va_start成对使用 return(cnt); } /**************************************************************** * 主函数 *****************************************************************/ int main(int argc, char* argv[]) { int inumber = 30; float fnumber = 90.0; char string[4] = "abc"; vspf("%d %f %s", inumber, fnumber, string); printf("%s\n", buffer); return 0; } 下面我们来探讨如何写一个简单的可变参数的C函数. 2.写可变参数的C函数要在程序中用到以下这些宏: void va_start( va_list arg_ptr, prev_param ); type va_arg( va_list arg_ptr, type ); void va_end( va_list arg_ptr );

对于C语言中的scanf函数的使用问题总结

对于C语言中的scanf函数的小结 对于scanf函数的作用大家应该都知道吧。在任何一本C语言的教材中都有过介绍,它的一般形式是(格式控制,地址表列) 我今天想说说使用这个scanf函数的时候,应该注意哪些问题吧。 1.scanf函数中的格式控制应该是变量名的地址,而不是变量名,例如a和b为整形变量,如果写成scanf(“%d%d”,a,b); 就会出错的,应该将这个,a,b改成&a,&b;(表示地址) 2我们都知道C语言中的字符串是存放到字符数组中的,如果我们定义了一个字符数组,如char a[20];我们想把字符串输入到这个字符数组中通常有两种方式,第一种.逐个字符输入,采用for循环的形式。第二种,直接输入字符串的形式,用格式控制符%s.第一种我们这样输入, for(i=0;i<=19;i++) { Scanf(“%c”,&a[i]); } 第二种我们用这种方式输入 Scanf(“%s”,a); 注意第二种这种形式,我们没有加&,这是为什么呢,这是

因为,C语言中把这个数组名当做该数组的起始地址。但是这种数组仅限于字符数组,不要企图,利用数值型数组的名。来整体输入,一个数值型的数组,这就是大错误了,比如这样写是不正确的 Int a[10]; Scanf(“%d”,a); 数值型数组的输入只能采用上面的第一种方法。 3对于指针问题,大家需要注意一点, 指针就是地址,这是在任何条件下都成立的,(请允许我极端一点),比方看下面的例子。 Char *p; Char a[20]; P=a; For(i=0;i<20;i++,p++) { Scanf(“%c”,p); } 这是一个采用指针变量输入数据的例子,这里的指针变量p 在for循环之前就指向了这个数组a,也就是指向了数组的首元素,也就是是说指针变量p里存放的是,数组首元素的地址,所以在用这个scanf函数进行输出时,指针变量的前方就不用再加取地址符号了。

c语言输入输出函数知识点总结

c语言输入输出函数知识点总结 1.I/O input output(输入端,输出端) 输入:从计算机向外部输出设备(显示器,打印机)输出数据。 输出:从输入设备(键盘、鼠标、扫描仪)向计算机输入数据。 2.C语言本身不提供输入输出语句,输入和输出操作是由C函数库中的函数实现的。 3.字符输出函数一般形式:putchar(a);a可以是字符型变量、整型变量、字符常量、整型常量。函数作用:向终端输出一个字符。 4.字符输入函数一般形式:a=getchar( );函数作用:从终端输入一个字符。函数值:从输入设备得到的字符。 5.格式输出字符 %d:以十进制输出整数;%o:以八进制形式输出整数;%c:以字符形式输出一个字符;%s:输出字符串;%f:以小数形式输出单、双精度数,隐含输出六位小数。 6.getchar一次只能输入一个字符,有几个getchar()就输入几个字符,多输入的计算机不能识别。 7.getchar()输入的时候,空格键、Enter键、Tab键不能乱用,他们都当成字符对待。 printf("%d,%c,%f,%o,%x,%s",a,b,c,d,e,f); .......................................... 8.格式控制都是小写字母; 9.格式控制与后面要输出的变量是一一对应;................................................... 10.printf("%md",a); 1).m是整数; 2).m是指输出的结果占m列宽度; 3).m是正整数的话,输出结果差几列左补几个空格; m是负整数的话,输出结果差几列右补几个空格; 4).如果m的绝对值小于原来数的宽度,则原样输出。................................................... 11.printf("%m.nf",a); 1).m是指输出占几列宽度,n是指输出结果小数点后保留几位有效数字; 2).m是正整数的话,输出结果差几列左补几个空格; m是负整数的话,输出结果差几列右补几个空格; 3).printf("%2.5f",a); m

printf和scanf

格式化占位符[编辑] 格式化字符串中的占位符用于指明输出的参数值如何格式化。格式化占位符(format placeholder) 语法是: %[parameter][flags][field width][.precision][length]type Parameter可以忽略或者是: Flags可为0个或多个:

Field Width给出显示数值的最小宽度,典型用于制表输出时填充固定宽度的表目。实际输出字符的个数不足域宽,则根据左对齐或右对齐进行填充。实际输出字符的个数超过域宽并不引起数值截断,而是显示全部。宽度值的前导0被解释为0填充标志,如上述;前导的负值被解释为其绝对值,负号解释为左对齐标志。如果域宽值为*,则由对应的函数参数的值为当前域宽。 Precision通常指明输出的最大长度,依赖于特定的格式化类型。对于d、i、u、x、o的整型数值,是指最小数字位数,不足的位要在左侧补0,如果超过也不截断,缺省值为1。对于a,A,e,E,f,F的浮点数值,是指小数点右边显示的数字位数,必要时四舍五入;缺省值为6。对于g,G的浮点数值,是指有效数字的最大位数。对于s的字符串类型,是指输出的字节的上限,超出限制的其它字符将被截断。如果域宽为*,则由对应的函数参数的值为当前域宽。如果仅给出了小数点,则域宽为0。 Length指出浮点型参数或整型参数的长度。此项Microsoft称为“Size”。可以忽略,或者是下述:

此外,在ISO C99广泛接受前,还有几个平台相关的length选项: ISO C99的头文件inttypes.h包含了许多宏,用于平台独立的printf编码。例如:

通过scanf函数从键盘输入数据

通过scanf函数从键盘输入数据 1)当调用scanf函数从键盘输入数据时,最后一定要按下回车键,scanf函数才能接受键盘输入的数据。 2)输入数据值 当键盘输入数据时,输入的数值数据之间用间隔符隔开。列<间隔符>10<间隔符>20 <间隔符> 此处间隔符可以是空格符、制表符(Tab)、回车符。 3)跳过输入数据的方法 可以在格式字符和%之间加上一个*,它的作用是跳过对应的输入数据。列 Int a1,a2, a3; Scanf("%d%d*%d%d%d",&a1,&a2,&a3); 当输入如下数据时:10 20 30 40 将把10赋给a1,跳过20,把30赋给a2,把10赋给a3 4)在格式字符串中插入其他字符 如果想在屏幕上输入字符串来提示,应该使用printf函数,如果在scanf的格式控制字符串中插入其他字符,则在输入时要求按一对一的位置原样输入这些字符 列1 Int a1,a2,a3; Scanf(“inpat a1,a2,a3:%d%d%d”,&a1,&a2,&a3); 要求按以下形式进行输入 Input a1,a2,a3:102030 列1 以下程序由终端出入两个整数给变量x和y,在交换x和y的值后,在输出x和y,验证两个变量中的数是否正确的进行了交换。 #inclube "stdio.h" Main() {int x,y,t; Printf("enter x&y:\n"); Scanf("%d %d",&x,&y); Printf9("x=%d y=%d\n",x,y); T=x;x=y;y=t; Printf("x=%d y=%d\n",x,y); } 列2 输入一个doulbe类型的数,使该数保留小数点后两位,对第三位小数进行四舍五入后处理,然后输出此数,以便验证处理是否正确。

C语言字符串的输入和输出

C语言字符串的输入和输出 字符串的输入和输出 %c人为加入\0进行输入输出 %s直接输入输出 *输入输出字符串时字符数组应有足够的存储空间,指针变量作为输入项时,指针必须已经指向确切的、足够大的存储空间 %s的使用 scanf("%s",地址值) 地址值:字符数组名、字符指针、字符数组元素的地址 例:char str[15]; scanf("%s",str); abc123 1.不读入空格和回车,从空格处结束 2.输入字符串长度超过字符数组元素个数,不报错 3.当输入项为字符指针时,指针必须已指向确定的有足够空间的连续 存储单元 4.当为数组元素地址时,从此元素地址开始存放 2.printf("%s",地址值) 输出时遇到第一个'\0'为止 3.gets和puts函数 开头必须stdio.h #include"stdio.h"

1.gets(地址值) 地址值:字符数组名、字符指针、字符数组元素的地址 4.当为数组元素地址时,从此元素地址开始存放 5.printf("%s",地址值) 输出时遇到第一个'\0'为止 6.gets和puts函数 开头必须stdio.h #include"stdio.h" 1.gets(地址值) 地址值:字符数组名、字符指针、字符数组元素的地址 7.例: char str[10]; gets(str); 包括空格符 8. 2.puts(字符串起始地址) 遇第一个'\0'结束,自动加入换行符 9.字符串数组:数组中每个元素都是一个存放字符串的数组 可以将一个二维数组看作是字符串数组 10.char ca[3][5]={"A","BB","CCC"}; A\0 B B\0 C C C\0 字符型指针数组 char*pa[3]={"a","bb","ccc"}; pa[0]pa[1]pa[2] 可以重新赋值gets(pa[2]);

C语言格式输入函数SCANF()详解

scanf函数称为格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。 scanf函数的一般形式 scanf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。与printf函数相同,C语言也允许在使用scanf函数之前不必包含stdio.h文件。scanf函数的一般形式为: scanf(“格式控制字符串”,地址表列); 其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。地址表列中给出各变量的地址。地址是由地址运算符“&”后跟变量名组成的。 例如:&a、&b分别表示变量a和变量b的地址。 这个地址就是编译系统在内存中给a、b变量分配的地址。在C 语言中,使用了地址这个概念,这是与其它语言不同的。应该把变量的值和变量的地址这两个不同的概念区别开来。变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。 变量的地址和变量值的关系 在赋值表达式中给变量赋值,如: a=567; 则,a为变量名,567是变量的值,&a是变量a的地址。 但在赋值号左边是变量名,不能写地址,而scanf函数在本质上也是给变量赋值,但要求写变量的地址,如&a。这两者在形式上是不同的。&是一个取地址运算符,&a是一个表达式,其功能是求变量的

地址。 【例4-7】 #include int main(void){ int a,b,c; printf("input a,b,c\n"); scanf("%d%d%d",&a,&b,&c); printf("a=%d,b=%d,c=%d",a,b,c); return0; } 在本例中,由于scanf函数本身不能显示提示串,故先用printf 语句在屏幕上输出提示,请用户输入a、b、c的值。执行scanf语句,等待用户输入。在scanf语句的格式串中由于没有非格式字符在 “%d%d%d”之间作输入时的间隔,因此在输入时要用一个以上的空格或回车键作为每两个输入数之间的间隔。如: 789 或 7 8 9 格式字符串 格式字符串的一般形式为:

scanf()getchar()和gets()等函数的注意事项

------------------------------------------------------------------- | 问题描述一:(分析scanf()和getchar()读取字符)| ------------------------------------------------------------------- scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的。但是有时候却就是因为使用这些函数除了问题,却找不出其中的原因。下面先看一个很简单的程序: 程序1: #include int main() { char ch1, ch2; scanf("%c", &ch1); scanf("%c", &ch2); printf("%d %d\n", ch1, ch2); return 0; } 或者是: #include int main() { char ch1, ch2; ch1 = getchar();

ch2 = getchar(); printf("%d %d\n", ch1, ch2); return 0; } 程序的本意很简单,就是从键盘读入两个字符,然后打印出这两个字符的ASCII码值。可是执行程序后会发现除了问题:当从键盘输入一个字符后按下回车准备输入第二个字符时,就打印出了结果,根本就没有输入第二个字符程序就结束了。例如用户输入字符'a'回车, 打印结果是97,10(回车)。输入字符'a'-空格-‘b’,结果为97 32也就是说ch2接收的是空格而不是’b’。这是为什么呢? 【分析】: 首先我们呢看一下输入操作的原理,程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时(按下回车键)会将输入的数据全部存入输入缓冲区(包括空格和回车),而输入函数直接从输入缓冲区中取数据。正因为输入函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,输入函数会直接取得这些残留数据而不会请求键盘输入,这就是例子中为什么会出现输入语句失效的原因! 其实这里的10恰好是回车符!这是因为scanf()和getchar()函数是从输入流缓冲区中读取值的,而并非从键盘(也就是终端)缓冲区读取。而读取时遇到回车(\n)而结束的,这个\n会一起读入输入流缓冲区的,所以第一次接受输入时取走字符后会留下字符\n,这样

C语言中文件_数据的输入输出_读写

C语言中文件,数据的输入输出,读写. 文件是数据的集合体,对文件的处理过程就是对文件的读写过程,或输入输出过程。 所谓文件是指内存以外的媒体上以某种形式组织的一组相关数据的有序集合。文件分类: 顺序文件,随机文件。 文本文件和二进制文件。 文本文件也称为ASCII文件,在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。 文本文件可以在屏幕上按字符显示,源程序文件就是文本文件,由于是按字符显示,所以能读懂文件内容。 二进制文件是按二进制编码方式来存放的。这里主要讨论文件的打开,关闭,读,写,定位等操作。 文件的存取方法 C程序的输入输出(I/O)有两种方式:一种称为标准I/O或流式I/O,另一种称为低级I/O。流式I/O是依靠标准库函数中的输入输出函数实现的。低级I/O利用操作系统提供的接口函数(称为底层接口或系统调用)实现输入输出,低级I/O 主要提供系统软件使用。 在C语言中用一个FILE类型的指针变量指向一个文件,(FILE类型是系统在stdio.h中定义的描述已打开文件的一种结构类型),这个指针称为文件指针。FILE *指针变量标识符; 如 FILE *fp; 文件的打开与关闭 所谓打开文件,指的是建立文件的各种有关信息,并使文件指针指向该文件,以便对它进行操作。 关闭文件则是断开指针与文件之间的联系,也就禁止再对该文件进行操作。 1、fopen 函数原型:FILE *fopen(const char *filename,const char *mode); Fopen函数用来打开一个文件,前一部分用来说明文件路径及文件名,后一部分mode指出了打开文件的存取方式;返回值是被打开文件的FILE型指针,若打开失败,则返回NULL。打开文件的语法格式如下: 文件指针名=fopen(文件名,使用文件方式); 文件指针名必须被说明为FILE类型的指针变量。 FILE *fp; fp=fopen(“C:\\Windowss\\abc.txt”,”r”); 注意用两个反斜杠\\来表示目录间的间隔符。 存取文件的模式是一个字符串,可以由字母r,w,a,t,b及+组合而成,各字符的含

C语言Printf和Scan函数的使用方法

C语言Printf和Scan函数的使用方法 一printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。在编写程序时经常会用到此函数。printf()函数的调用格式为: printf("<格式化字符串>", <参量表>); 其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符, 用来确定输出内容格式。 参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则将会出现意想 不到的错误。 格式化字符串的格式是: %[标志][输出最小宽度][.精度][长度]格式字符 1. 标志:标志字符为-、+、#、空格四种,其意义下表所示: 标志意义 - 结果左对齐,右边填空格 + 输出符号(正号或负号) 空格输出值为正时冠以空格,为负时冠以负号 # 对c,s,d,u类无影响;对o类,在输出时加前缀o;对x类,在输出时加前缀0x;对e,g,f 类当结果有小数时才给出小数点(??????) 例1: #include main() { int a=100; float b=123.255; printf("a=%d ",a); printf("a=%10d ",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

格式化输入、输出函数的使用

南京信息工程大学实验(实习)报告 实验(实习)名称 C语言实验日期 4.11 得分指导教师刘文杰 院大气物理专业安全工程年级 16级班次一班姓名刘亚栎学号 20161395007 1.实验目的: 1)掌握格式字符使用的方法。 2)掌握printf()进行格式化输出的方法。 3)掌握scanf()进行格式化输入的方法。 2.实验内容: (1)输入如下程序,观察运行的结果。 #include int main() { int x=1234; float f=123.456; double m=123.456; char ch='a'; char a[]="Hello,world"; int y=3,z=4; printf("%d %d\n",y,z); printf("y=%d,z=%d\n",y,z); printf("%8d,%2d\n",x,x); printf("%f,%8f,%8.1f,%.2f,%.2e\n",f,f,f,f,f); printf("%lf\n",m); printf("%3c\n",ch); printf("%s\n%15s\n%10.5s\n%2.5s\n%.3\n",a,a,a,a,a); return 0; } (2)输入下面程序,观察调试信息。 #include int main() { double x,y; char c1,c2,c3; int a1,a2,a3; scanf("%d%d%d",a1,a2,a3); printf("%d,%d,%d\n",a1,a2,a3); scanf("%c%c%c",&c1,&c2,&c3); printf("%c%c%c\n",c1,c2,c3); scanf("%f,%lf",&x,&y); printf("%f,%lf\n",x,y); return 0;

C语言数据的输入与输出

C语言数据的输入与输出 一.Printf函数 函数原型在头文件stido.h中(使用时可以不包括) printf函数的返回值等于成功输入得数据的个数 1.printf函数得一般调用形式 printf(格式控制字符串,输出项列表) 格式控制字符串包括: (1)格式指示符 格式:%[标志][宽度][.精度][ [ h|l ] <类型>] (2)转义字符 如:'\n' , '\0' (3)普通字符 如:printf("max=%d,min=%d\n", a, b); “max=”和“,min=”是普通字符;“%d”是格式指示符;“\n”是转义字符; a和b是输出类表中的输出项(可以是常量、变量、或表达式)。 2.print函数中常用得格式控制说明 (1)数据类型控制字符 (2)数据类型修饰符 数据类型修饰符在%和数据类型控制符之间 如:长整型 "%ld" ,短整型 "%hd" (3)输出数据所占得宽度与精度

1)在%与格式字符之间插入一个整数来指示输出宽度。 若指定得输出宽度不够,系统自动以数据实际值得宽度作为输出宽度;如果指定的输出宽度多于数据实际所需宽度,数据右对齐,左边补以空格。 如:printf("%5d\n",42); \*输出结果: 42*\ 2)float或double类型得实型数可以用“整数1.整数2”的形式在指定总宽度的同时指定小数位得宽度。“整数1”指定输出数据得总宽度(小数点也要计算在内),“整数2”称之为精度,即小数位的位数。 注意:输出数据得实际精度并补取决与格式控制中的域宽和小数得位宽,而是取决于数据在计算机内的存储精度。 (4)标志控制字符 1)输出数据左对齐的标志字符“-”,在指定输出宽度之前。 如:printf("%-5d##\n",24); \*输出结果:24 ##*\ 2)输出数字总是带正负号得标志字符“+”,在%和格式字符之间(或指定得输出宽度前) 如:printf("%+d,%+d\n",100,-200); \*输出结果:+100,-200*\ 3)在输出数据前加前导0,可以在指定输出宽度得同时,在数据前面得多于空格处填以数字0。 如:printf("%05d\n",59); \*输出结果:00059*\ 二.Scanf函数 函数原型在头文件stdio.h中(使用时可以不包括) Scanf函数的返回值等于成功输入得数据的个数。 1.scanf函数得一般调用形式 scanf(格式控制字符串,地址列表) 格式控制字符串:%[*][输入数据宽度][ h|l ]<类型> 地址列表是各变量得地址,如:&a,&b

C语言中Printf和Scanf 的使用方法详细

C语言中Printf和Scanf 的使用方法详细 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

C语言中的输入输出函数总结

putchar ():把变量中的一个字符常量输出到显示器屏幕上; getchar ();从键盘上输入一个字符常量,此常量就是该函数的值; printf ();把键盘中的各类数据,加以格式控制输出到显示器屏幕上; scanf ();从键盘上输入各类数据,并存放到程序变量中; puts ():把数组变量中的一个字符串常量输出到显示器屏幕上; gets ():从键盘上输入一个字符串常量并放到程序的数组中. sscanf(); 从一个字符串中提取各类数据。 putchar() 输出一个字符 getchar() 输入流中获取一个字符 例如: char c = getchar(); putchar(c); 格式化输入输出scanf()和printf()是最有用的,所以重点讲一下。 printf(): 一般形式: printf("格式控制".输出列表); eg : printf("a=%d,b=%f,c=%c\n",a,b,c); 1;格式控制. 格式控制是用双引号括起来的字符串,也称"转换控制字符串",它包含以下两部分信息. 格式说明:由"%"和格式字符组成,如%d,%f,%c,他的作用是把输出数据转换为指定格式输出,格式的说明总是由"%"字符开始的. 普通字符:需要原样输出的字符,或者是一些有特殊含义的字符,如\n,\t。 2;输出列表 就是需要输出的一些数据,也可以是表达式,如果在函数中需要输出多个变量或表达式,则要用逗号隔开. 一些特殊字符的输出: 单引号,双引号,和反斜杠的输出在前面加转义字符”\” 如:”\’” , “\””, “\\” %的输出用两个连在一起的%%,即printf(“%%”); 常用的格式说明如下: 格式字符 d 以十进制形式输出带符号整数(正数不输出符号) o 以八进制形式输出无符号整数(不输出前缀O) x 以十六进制形式输出无符号整数(不输出前缀OX) u 以十进制形式输出无符号整数 f 以小数形式输出单精度实数 lf 以小数形式输出双精度实数

相关主题
文本预览
相关文档 最新文档