当前位置:文档之家› Printf和Scanf函数整理

Printf和Scanf函数整理

Printf和Scanf函数整理
Printf和Scanf函数整理

Printf和Scanf函数整理

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

信息。在编写程序时经常会用到此函数。

1.printf()函数的调用格式为:printf("<格式化字符串>", <参量表>);

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

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

用来确定输出内容格式。

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

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

不到的错误。

格式化字符串的格式是:%[标志][输出最小宽度][.精度][长度]格式字符

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

标志意义

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

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

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

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

例1:

#include

void 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

a= 100

a=100

a=+100

a= 100

a=0144

a=0x64

b=123.254997

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

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

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

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

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

例2 #include

main()

{

int a=3456;

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

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

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

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

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

}

运行结果:

a=3456

a= 3456

a=3456

a=0000003456

a=3456

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

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

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

例3:

#include

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

#include

#include

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); /*结果输出十进制整数a=1234*/

printf("a=%6d ", a); /*结果输出6位十进制数a= 1234*/

printf("a=%06d ", a); /*结果输出6位十进制数a=001234*/

printf("a=%2d ", a); /*a超过2位, 按实际值输出a=1234*/

printf("*i=%4d ", *i); /*输出4位十进制整数*i= 12*/

printf("*i=%-4d ", *i); /*输出左对齐4位十进制整数*i=12*/

printf("i=%p ", i); /*输出地址i=06E4*/

printf("f=%f ", f); /*输出浮点数f=3.141593*/

printf("f=6.4f ", f); /*输出6位其中小数点后4位的浮点数

f=3.1416*/

printf("x=%lf ", x); /*输出长浮点数x=0.123457*/

printf("x=%18.16lf ", x);/*输出18位其中小数点后16位的长浮点

数x=0.1234567898765432*/

printf("c=%c ", c); /*输出字符c=A*/

printf("c=%x ", c); /*输出字符的ASCII码值c=41*/

printf("s[]=%s ", s); /*输出数组字符串s[]=Hello, Comrade*/

printf("s[]=%6.9s ", s);/*输出最多9个字符的字符串s[]=Hello, Co*/

printf("s=%p ", s); /*输出数组字符串首字符地址s=FFBE*/

printf("*p=%s ", p); /* 输出指针字符串p=How do you do*/

printf("p=%p ", p); /*输出指针的值p=0194*/

//getch();

return 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。

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

二 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("%5d",&a);

输入:12345678

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

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

输入:12345678

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

例:

main()

{

int a,b;

scanf("%4d%4d",&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即为非法数据)时即认为该数据结束

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/d05771717.html,) 本文分上,下两篇讲述了C语言中的scanf()函数的用法,重点阐述使用scanf()函数过程中出现的常见错误及对策。当然,文中某些解决方法,均可以采用其他函数和方法来更好地解决,但本文仅限讨论scanf()函数本身。 上篇,详细介绍了scanf()函数控制串的构成。下篇,用实际例程介绍scanf()函数控制串运用出现的常见错误及对策技巧。 二、scanf()函数的控制串 函数名: scanf 功能: 执行格式化输入 用法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。 其调用格式为: scanf("<格式化字符串>",<地址表>); scanf()函数返回成功赋值的数据项数,出错时则返回EOF。 其控制串由三类字符构成: 1。格式化说明符; 2。空白符; 3。非空白符; (A)格式化说明符

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(代表一个正整数据最小输出显示宽度

6步教你在STM32程序中添加 printf函数

6步教你在STM32程序中添加printf函数 6步教你在STM32程序中添加printf函数 前提是你有一个完整的可以运行的keil工程比如ADC的 调试的时候很多时候用到串口这里教你怎么样使用Printf 函数 在程序中添加Printf.txt 1, #include 2, /* Private functions ---------------------------------------------------------*/ 下添加 void USART_Configuration(void); #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__ */ 3,添加如下2个函数usart配置和重定向C库的printf函数 void USART_Configuration() { /* USARTx configured as follow: - BaudRate = 9600 baud - Word Length = 8 Bits - One Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled */ USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; /* Configure USART1 Tx (PA9) as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure USART1 Rx (PA10) as input floating */

c++ printf使用及参数详解

c++ printf使用及参数详解 1.调用格式为 printf("<格式化字符串>", <参量表>); 其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符, 用来确定输出内容格式。参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则将会出现意想不到的错误。 2.格式化字符 %d 十进制有符号整数 %u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %e 指数形式的浮点数 %x, %X 无符号以十六进制表示的整数 %0 无符号以八进制表示的整数 %g 自动选择合适的表示法 说明: (1). 可以在"%"和字母之间插进数字表示最大场宽。例如: %3d 表示输出3位整型数, 不够3位右对齐。%9.2f 表示输出场宽为9的浮点数, 其中小数位为2, 整数位为6, 小数点占一位, 不够9位右对齐。超过9位,按实际输出。%8s 表示输出8个字符的字符串, 不够8个字符右对齐。如果字符串的长度、或整型数位数超过说明的场宽, 将按其实际长度输出。但对浮点数, 若整数部分位数超过了说明的整数位宽度, 将按实际整数位输出; 若小数部分位数超过了说明的小数位宽度, 则按说明的宽度以四舍五入输出。另外, 若想在输出值前加一些0, 就应在场宽项前加个0。例如: %04d 表示在输出一个小于4位的数值时, 将在前面补0使其总宽度为4位。如果用浮点数表示字符或整型量的输出格式, 小数点后的数字代表最大宽度, 小数点前的数字代表最小宽度。例如: %6.9s 表示显示一个长度不小于6且不大于9的字符串。若大于9, 则第9个字符以后的内容将被删除。 (2). 可以在"%"和字母之间加小写字母l, 表示输出的是长型数。例如: %ld 表示输出long整数, %lf 表示输出double浮点数。 (3). 可以控制输出左对齐或右对齐, 即在"%"和字母之间加入一个"-" 号可说明输出为左对齐, 否则为右对齐。例如: %-7d 表示输出7位整数左对齐,%-10s 表示输出10个字符左对齐。 3. 一些特殊规定字符 \n换行 \f清屏并换页 \r回车 \t Tab符 \xhh表示一个ASCII码用16进表示, 其中hh是1到2个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函数进行输出时,指针变量的前方就不用再加取地址符号了。

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语言Printf之使用及在单片机中的用法

一、printf常用说明 printf的格式控制的完整格式: % - 0 m.n l或h 格式字符 下面对组成格式说明的各项加以说明: ①%:表示格式说明的起始符号,不可缺少。 ②-:有-表示左对齐输出,如省略表示右对齐输出。 ③0:有0表示指定空位填0,如省略表示指定空位不填。 ④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。N指精度。用于说明输出的实型数的小数位数。为指定n时,隐含的精度为n=6位。 ⑤l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。 ---------------------------------- 格式字符 格式字符用以指定输出项的数据类型和输出格式。 ①d格式:用来输出十进制整数。有以下几种用法: %d:按整型数据的实际长度输出。 %md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。 %ld:输出长整型数据。 ②o格式:以无符号八进制形式输出整数。对长整型可以用"%lo"格式输出。同样也可以指定字段宽度用“%mo”格式输出。例: main() { int a = -1; printf("%d, %o", a, a); } 运行结果:-1,177777 程序解析:-1在内存单元中(以补码形式存放)为(1111111111111111)2,转换为八进制数为(177777)8。 ③x格式:以无符号十六进制形式输出整数。对长整型可以用"%lx"格式输出。同样也可以指定字段宽度用"%mx"格式输出。 ④u格式:以无符号十进制形式输出整数。对长整型可以用"%lu"格式输出。同样也可以指定字段宽度用“%mu”格式输出。 ⑤c格式:输出一个字符。

C语言printf函数详解

功能: 产生格式化输出的函数。 用法: printf(格式控制字符串,参数1,参数2,…,参数n); 格式控制字符串定义为: %[flags][width][.perc][F|N|h|l]type type d有符号10进制整数 i有符号10进制整数 o无符号8进制整数 u无符号10进制整数 x无符号的16进制数字,并以小写abcdef表示 X无符号的16进制数字,并以大写ABCDEF表示 f浮点数 E/e用科学记数法表示浮点数 g用%f和%e表示中,总的位数最短的来表示浮点数。G同g格式,但表示为指数c单个字符 s字符串 S wchar_t字符(宽字符)类型字符串 %显示百分号本身 p显示一个指针,near指针表示为:XXXX,far指针表示为:XXXX:YYYY n相连参量应是一个指针,其中存放已写字符的个数 flags:规定输出格式 无右对齐,左边填充0和空格 -左对齐,右边填充空格 +在数字前增加符号+或- 0 将输出的前面补上0,直到占满指定列宽为止(不可以搭配使用-) 空格输出值为正时冠以空格,为负时冠以负号 #当type=c,s,d,i,u时没有影响;当type=o,x,X时,分别在数值前增加'0',"0x","0X"; 当type=e,E,f时,总是使用小数点;当type=g,G时,除了数值为0外总是显示小数点。 width:用于控制显示数值的宽度 n(n=1,2,3...)宽度至少为n位,不够以空格填充 0n(n=1,2,3...)宽度至少为n位,不够左边以0填充 *格式列表中,下一个参数还是width prec:用于控制小数点后面的位数 无按缺省精度显示 0当type=d,i,o,u,x时,没有影响;当type=e,E,f时,不显示小数点 n(n=1,2,3...)当type=e,E,f时,表示的最大小数位数

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编码。例如:

实用C语言scanf函数应用问题解答

C语言scanf函数应用问题解答 C语言的输入是由系统提供的库函数完成的。scanf函数是C语言中最常用且功能最强的输入函数,但该函数如使用不慎,就会出现错误或得不到预想的结果。以下结果都是基于VC++6.0运行环境。 一、格式说明符和输入项的三对应(类型、个数、顺序)scanf 函数格式中的格式说明(“%格式字符”)应与输入项数据类型一致,个数相等、顺序对应(除格式说明中出现“*”附加格式说明字符外)。示例一:inta,b;scanf(%d%d%d,a,b);printf(%d,%d,a,b);输入“345”时,输出“3,4”,没有错误提示信息,但是第三个数没有接收的变量,也就没有输出。再如inta,b;scanf(%d,a,b);printf(%d,%d,a,b);输入“34”时,输出“3,-858993460”,a得到3,但b是一个随机数,都是因为格式说明(“%格式字符”)与输入项个数不一致造成的。再如structst{intnum;charname[10];intage;floatscore;}student;scanf(%d, %s,%d,%f,student);输入“10001,zhang,23,68”,运行程序时,无出错信息,但student不能正确接收输入数据。 应该写成:scanf(%d,%s,%d,%f,student.num,https://www.doczj.com/doc/d05771717.html,,student.age,stu-dent. score);保证格式说明与输入项个数相等、一一对应,才能使student正确接收输入数据。示例二:chara,b;scanf(%d%d,a,b);printf(%d,%d,a,b);输入“34”时,输出

C中Printf函数的格式控制

printf的格式控制的完整格式: % - 0 m.n l或h 格式字符 下面对组成格式说明的各项加以说明: ①%:表示格式说明的起始符号,不可缺少。 ②-:有-表示左对齐输出,如省略表示右对齐输出。 ③0:有0表示指定空位填0,如省略表示指定空位不填。 ④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。N指精度。用于说明输出的实型数的小数位数。为指定n时,隐含的精度为n=6位。 ⑤l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。 --------------------------------------- 格式字符 格式字符用以指定输出项的数据类型和输出格式。 ①d格式:用来输出十进制整数。有以下几种用法: %d:按整型数据的实际长度输出。 %md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。 %ld:输出长整型数据。 ②o格式:以无符号八进制形式输出整数。对长整型可以用"%lo"格式输出。同样也可以指定字段宽度用“%mo”格式输出。 例: main() { int a = -1; printf("%d, %o", a, a); } 运行结果:-1,177777 程序解析:-1在内存单元中(以补码形式存放)为(1111111111111111)2,转换为八进制数为(177777)8。 ③x格式:以无符号十六进制形式输出整数。对长整型可以用"%lx"格式输出。同样也可以指定字段宽度用"%mx"格式输出。 ④u格式:以无符号十进制形式输出整数。对长整型可以用"%lu"格式输出。同样也可以指定字段宽度用“%mu”格式输出。 ⑤c格式:输出一个字符。 ⑥s格式:用来输出一个串。有几中用法 %s:例如:printf("%s", "CHINA")输出"CHINA"字符串(不包括双引号)。 %ms:输出的字符串占m列,如字符串本身长度大于m,则突破获m的限制,将字符串全部输出。若串长小于m,则左补空格。 %-ms:如果串长小于m,则在m列范围内,字符串向左靠,右补空格。 %m.ns:输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格。 %-m.ns:其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如果n>m,则自动取n值,即保证n个字符正常输出。

单片机程序巧用printf

单片机程序巧用printf 当我们在调试代码时,通常需要将程序中的某个变 量打印至PC机上,来判断我们的程序是否按预期的运行,printf函数很好的做到了这一点,它能直接以字符的方 式输出变量名和变量的值。 printf函数在使用时,不仅仅要初始化串口,还需要其 它的一些设置或者要调用其它的一些函数否则printf 函数将不能按我们想要的方式执行。 由于不同的编译器studio函数不一样,所以使用的方法也不一样,这需要大家去看编译器的help帮助选项,这里我们以STM32、51和AVR整理了几个串口打印程序,供需要的朋友参考。 1、在KEIL下使用printf函数,以STM32为例 在uart.c中添加如下代码 View Code /************************************************ ******************************* 函数名:fputc 输入: 输出:

功能说明: 重定义putc函数,这样可以使用printf函数从串口 1打印输出 ************************************************* ******************************/ int fputc(int ch, FILE *f) { /* Place your implementation of fputc here */ /* e.g. write a character to the USART */ USART_SendData(USART1, (uint8_t) ch); /* Loop until the end of transmission */ while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} return ch; } /************************************************ ******************************* 函数名:fputc 输入:

Printf格式

printf( )格式 printf()格式转换的一般形式如下 %(flags)(width)(.prec)type 以括号括起来的参数为选择性参数,而%与type则 是必要的。底下先介绍type的几种形式 %d 整数的参数会被转成一有符号的十进制数字 %u 整数的参数会被转成一无符号的十进制数字 %o 整数的参数会被转成一无符号的八进制数字 %x 整数的参数会被转成一无符号的十六进制数 字,并以小写abcdef表示 %X 整数的参数会被转成一无符号的十六进制数 字,并以大写ABCDEF表示浮点型数 %f double 型的参数会被转成十进制数字,并取到小 数点以下六位,四舍五入。 %e double型的参数以指数形式打印,有一个数字 会在小数点前,六位数字在小数点后,而在指数部 分会以小写的e来表示。 %E 与%e作用相同,唯一区别是指数部分将以大写 的E 来表示。 %g double 型的参数会自动选择以%f 或%e 的格式 来打印,其标准是根据欲打印的数值及所设置的有 效位数来决定。 %G 与%g 作用相同,唯一区别在以指数形态打印时 会选择%E 格式。 字符及字符串 %c 整型数的参数会被转成unsigned char型打印出。 %s 指向字符串的参数会被逐字输出,直到出现 NULL字符为止 %p 如果是参数是“void*”型指针则使用十六进制 格式显示。 prec 有几种情况 1. 正整数的最小位数。 2. 在浮点型数中代表小数位数 3. 在%g 格式代表有效位数的最大值。 4. 在%s格式代表字符串的最大长度。 5. 若为*符号则代表下个参数值为最大长度。 width为参数的最小长度,若此栏并非数值,而是*

单片机中printf函数的运用

51中printf使用注意 C51标准串口发送程序(已C8051F120为例,注意C8051F120特殊功能寄存器是分页的) /*********************************************************** 函数名称:send_char_com 函数功能:向串口发送一字节字符 入口参数:unsigned char sendByte 一个字节字符(8 bit) 出口参数:无 备注: ***********************************************************/ void send_char_com(unsigned char sendByte) { char SFRPAGE_SA VE = SFRPAGE; //用到TI0(SCON0.1)SFR页:0 SFRPAGE = UART0_PAGE; SBUF0=sendByte; while (TI0== 0); //等待发送完毕 TI0= 0; //清发送中断标志TI0 SFRPAGE = SFRPAGE_SA VE; } /*********************************************************** 函数名称:send_char_com 函数功能:向串口发送一个字符串 入口参数:unsigned char *str 字符串数组首地址 unsigned int strlen 该字符串长度 出口参数:无 备注: ***********************************************************/ void send_string_com( unsigned char *str, unsigned int strlen) { unsigned int k= 0 ; do { send_char_com(*(str + k)); k++; } while (k < strlen); } 在C51中直接使用printf比自己编个串口发送字符串的函数方便,但有几个问题要注意的。 1. 使用printf之前要先包含stdio.h这个头文件 #include 具体stdio.h包含的函数见下面网址 https://www.doczj.com/doc/d05771717.html,/support/man/docs/c51/c51_stdio_h.htm 2.

关于scanf的问题

你好!我想请教你关于利用scanf函数输入时,留在键盘缓冲区的\n(ASCII值为10)的问题。期待你的回答。至于分数,你想要多少,说就行。我昨晚写程序时对scanf在键盘缓冲区留下的字符有疑问,思考不果。看了百度百科上的scanf 词条,说scanf输入遇到空格、跳格、回车才会从缓冲区往变量送字符。于是自己写了以下几个程序思考,还是不果。 程序1 #include "stdio.h" void main() { char a; char b; scanf("%d",&a); scanf("%d",&b); printf("%d %d",a,b); } 键盘输入 97<回车>96<回车> 输出 97 96 问题1:调用第一个scanf输入时,键盘缓冲区所有的字符为97\n,遇到回车,所以缓冲区把97赋值给a。调用第二个scanf输入时,键盘缓冲区所有的字符为96\n,遇到回车,所以缓冲区把96赋值给b。以上我的分析对吗? 程序2 #include "stdio.h" void main() { char a; char b; scanf("%c",&a); scanf("%c",&b); printf("%d %d",a,b); } 键盘输入 9<回车> 输出

问题2:调用第一个scanf输入时,键盘缓冲区所有的字符为9\n,遇到回车,所以缓冲区把9赋值给a。调用第二个scanf输入时,键盘缓冲区所有的字符为\n,遇到回车,所以缓冲区把\n赋值给b。以上我的分析对吗?如果对,那程序1中调用第一个scanf时,又为什么不是把97赋值给a后,将\n赋值给b呢?为什么调用第二个scanf时还需要继续输入96<回车>来对b赋值?调用第一个scanf输入时留在缓冲区的\n去哪里了?无端消失了? 程序3 #include "stdio.h" void main() { char a[100]; char b[100]; scanf("%s",a); scanf("%s",b); printf("%s %s",a,b); } 键盘输入 abc<回车>def<回车> 输出 abc def 问题3:从输出结果可以看出,字符数组a和字符数组b都在同一行输出。所以字符数组a的值为{…a?,?b?,?c?},不是{…a?,?b?,?c?,?\n?}。字符数组b的值为{…d?,?e?,?f?},不是{…\n?,…d?,?e?,?f?},也不是{…\n?,…d?,?e?,?f?,?\n?}。以上的分析对吗?如果对,那调用第一个scanf输入时留在缓冲区的\n去哪里了?还有第二个scanf留下\n呢? 程序4 #include void main() { int i; char j; for(i=0;i<2;i++) scanf("%c",&j);/*注意这里%前没有空格*/ printf("%d",j); } 键盘输入

printf格式化输出详解

printf()格式化输出详解 2009年03月28日星期六 13:39 本文来自:https://www.doczj.com/doc/d05771717.html,/language/20080420/7060.html printf的格式控制的完整格式: % - 0 m.n l或h 格式字符 下面对组成格式说明的各项加以说明: ①%:表示格式说明的起始符号,不可缺少。 ②-:有-表示左对齐输出,如省略表示右对齐输出。 ③0:有0表示指定空位填0,如省略表示指定空位不填。 ④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。N指精度。用于说明输出的实型数的小数位数。对数值型的来说,未指定n时,隐含的精度为n=6位。 ⑤l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。 --------------------------------------- 格式字符 格式字符用以指定输出项的数据类型和输出格式。 ①d格式:用来输出十进制整数。有以下几种用法: %d:按整型数据的实际长度输出。 %md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。 %ld:输出长整型数据。 ②o格式:以无符号八进制形式输出整数。对长整型可以用"%lo"格式输出。同样也可以指定字段宽度用“%mo”格式输出。 例: main() { int a = -1; printf("%d, %o", a, a); } 运行结果:-1,177777 程序解析:-1在内存单元中(以补码形式存放)为(1111111111111111)2,转换为八进制数为(177777)8。 ③x格式:以无符号十六进制形式输出整数。对长整型可以用"%lx"格式输出。同样也可以指定字段宽度用"%mx"格式输出。 ④u格式:以无符号十进制形式输出整数。对长整型可以用"%lu"格式输出。同样也可以指定字段宽度用“%mu”格式输出。 ⑤c格式:输出一个字符。 ⑥s格式:用来输出一个串。有几中用法 %s:例如:printf("%s", "CHINA")输出"CHINA"字符串(不包括双引号)。

printf函数

在进程中,堆栈地址是从高到低分配的.当执行一个函数的时候,将参数列表入栈,压入堆栈的高地址部分,然后入栈函数的返回地址,接着入栈函数的执行代码,这个入栈过程,堆栈地址不断递减,一些黑客就是在堆栈中修改函数返回地址,执行自己的代码来达到执行自己插入的代码段的目的. 总之,函数在堆栈中的分布情况是:地址从高到低,依次是:函数参数列表,函数返回地址,函数执行代码段. 堆栈中,各个函数的分布情况是倒序的.即最后一个参数在列表中地址最高部分,第一个参数在列表地址的最低部分.参数在堆栈中的分布情况如下: 最后一个参数 倒数第二个参数 ... 第一个参数 函数返回地址 函数代码段 static int printf(const char *fmt,...) { va_list args; int i; va_start(args,fmt); write(1,printfbuf,i=vsprintf(printbuf,fmt,args)); va_end(args); return i; } 1、#include 头文件 2、const char *fmt const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性. fmt为可变参数的前一个参数。控制字符串写入%d,%f的地方 70 va_start(args,fmt)是为了使fmt指向第一个可选参数 void va_start(va_list ap, last) va_start必须第一个调用,它初始化va_list类型的变量ap,使ap指向第一个可选参数。参数last 是可变参数列表(即函数原型中的省略号…)的前一个参数的名字,也就是最后类型已确定的函数参数名。因为这个参数的地址将会被宏va_start用到,所以最好不要是寄存器变量,函数,或者数组。 va_end(args)结束可变参数的获取

printf 函数中的格式转化字符及其含义

printf 函数中的格式转化字符及其含义 另外,可以在格式转换字符和%之间插入一些辅助的格式控制字符。因此,格式控制字符的一般格式为: %[flag][width][.precision][size]Type 有符号整数的输出 输出有符号整数的格式控制符的一般形式为: %[-][+][0][width][.precision][l][h]d 其中各控制符的说明如下: ?-:表示输出的数据左对齐,默认时是右对齐。 ?+:输出正数时,在数的前面加上+号。

?0:右对齐时,如果实际宽度小于width,则在右边的空位补0。 ?width:无符号整数,表示输出整数的最小宽度。若实际宽度大于width,则按照实际宽度输出。 ?precision:无符号整数,表示至少要输出precision位。若整数的位数大于precision,则按照实际的位数输出,否则在左边的空位 上补0。 ?l:输出长整形数据 ?h:输出短整形数据 无符号整数的输出 输出无符号整数的格式控制符的一般形式为: %[-][#][0][width][.precision][l][h]u|o|x|X 其中各控制符的说明如下: ?#:当以八进制形式输出数据(%o)时,在数字前输出0;当以十六进制形式输出数据(%x或%X)时,在数字前输出0x或0X。 ?precision:与前面介绍的相同,但要注意八进制数字前的0和十六进制前的0x或0X同样占位数。 ?其他字段与前面介绍的相同。

小结: 实数的输出 输出实数的格式控制符的一般形式为: %[-][+][#][0][width][.precision][l|L]f|e|E|g|G 其中各控制符的说明如下: ?#:必须输出小数点。 ?precision:规定输出实数时,小数部分的位数。 ?l:输出double型数据(默认也是输出double型数据)。 ?L:输出long double型数据。 ?其他字段的含义与前面介绍的相同。 字符和字符串的输出

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

深入了解scanf()getchar()gets()getch,getche

深入了解scanf()/getchar()/gets()/getch,getche ---------------------------------------------------- | 问题描述一:(分析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。这是为什么呢?【分析】: 首先我们呢看一下输入操作的原理,程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入,这就是例子中为什么会出现输入语句失效的原因! 其实这里的10恰好是回车符!这是因为scanf()和getchar()函数是从输入流缓冲区中读取值的,而并非从键盘(也就是终端)缓冲区读取。而读取时遇到回车(\n)而结束的,这个\n会一起读入输入流缓冲区的,所以第一次接受输入时取走字符后会留下字符\n,这样第二次的读入函数直接从缓冲区中把\n取走了,显然读取成功了,所以不会再从终端读取!这就是为什么这个程序只执行了一次输入操作就结束

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