C语言输入输出

C语言输入输出,第1张

C语言输入输出

文章目录
  • 一、scanf()
    • ①控制字符
    • ②参数列表
    • ③间隔符
  • 二、printf()
    • ①类型控制符(scanf一样)
    • ②占位控制
  • 三、scanf和printf的异同
  • 四、getchar、putchar、gets、puts
    • 1.getchar(void)
    • 2.putchar(int ch)
    • 3.gets(char *str)
    • 4.puts(const char *s)


格式化输入输出函数,能够对各种类型的数据混合地输入输出,主要是依靠一个格式控制字符串来实现的。在格式控制字符串内通过%符号加字母,对输入输出的目标数据的类型进行预先标明。控制字符串内的%符号后面的字母,我们称之为输入输出控制符。控制字符串内的每一个控制符,在控制字符串后面必须有一个相应类型的常量、变量或表达式。控制串内的控制字符与控制串后面的输入输出目标,在类型与个数上必须是一一对应的,否则在输入输出时就会出现混乱。 一、scanf()

控制字符

控制字符串也就是双引号内的部分,只允许放两种文字:控制符与间隔符。
控制字符串内多段控制符之间,只能是空格、逗号或者单独指定的某种间隔符。如果在控制串内随意加入一些文字,尤其是想把要打印的文字放入scanf函数的控制字符串内,那将是非常错误的。

②参数列表

scanf的参数列表内,带入的每个变量都必须用&符号取变量的地址。取变量的地址带入之后,在输入数据之后scanf才将用户输入的数据,能按照每个变量的地址送入到对应的变量中。

普通的整型、浮点数等类型的变量,代入到scanf的参数列表时必须取地址。
否则,如果不取地址scanf函数会将变量内的数值当做内存地址。

只有数组型变量可以不用取地址带入scanf函数,运行时用户输入数据之后程序也正常运行不会出错。原因是数组型变量自身就是一个内存地址,因此在scanf函数中数组型变量前可以不用加取地址符号&。

③间隔符

scanf函数的控制串内,除了控制符(%号加一个字母)之外,其余的文字都应该算作是间隔符。
例如:两段控制符之间用空格间隔,用户输入数据时就必须用空格间隔;如果两段控制符之间用逗号,用户输入时就必须用逗号间隔;如果两段控制符之间没有间隔符,缺省用户还是要用空格做间隔符。

二、printf()

①类型控制符(scanf一样) %c单字符%s字符串%d有符号十进制整数%u无符号十进制整数%f单精度浮点数%lf双精度浮点数%x无符号十六进制数%o无符号八进制数%p变量地址 ②占位控制

printf函数打印时的占位控制方式,包括:整数占位控制、浮点数占位控制以及字符串占位控制等。

一、浮点数占位控制方式分为以下几种情况:

1.%f(或%lf):不指定宽度,整数部分全部输出并输出6位小数。

printf("%f", 34.67852f);
printf("%lf", 254.0 / 3);

2.%m.nf:输出共占m列,其中有n位小数,如数值宽度小于m左端补空格。(小数点也算进m)
当m为0时,则不申请占位,按整数与小数自然需求占用。

printf("%8.3f", 34.67852f);   结果:空空34.678

3.%-m.nf:输出共占n列,其中有n位小数,如数值宽度小于m右端补空格。(小数点也算进m)
当m为0时,则不申请占位,按整数与小数自然需求占用。

printf("%-8.3f",34.678f);     结果:34.678空空

二、整数和字符串相同,只有占位控制和对齐控制,没有小数位控制:

1.%md或%-md:-符号代表左对齐,缺省不带-符号是右对齐。

printf("%-8d%10sn",1005, "张珊");	    // 8和10代表的是占位管理
printf("%-8d%10sn",1006, "李思思");	// 8和10代表的是占位管理

2. 右对齐时缺省占位符是空格,如果在%符号后加一个0则以0占位

printf("%08d%-10sn",1006, "李思思");	

占位控制在后期项目开发中,常用与数据集合的列表打印,让各种不同长度的数据在列表中对齐。另外,在打印一个内存地址时,占位控制也很好用。例如:
int i = 88;
printf(“i变量的内存地址是:0x%08xn”,&i);

三、scanf和printf的异同

一、相同点:
a) printf与scanf函数在格式上相似,也是分为控制字符串与列表参数两部分;
b)参数列表内输入输出目标的个数可以是很多个(没有上限),类型也可以是多种多样的;
c)控制串内的控制符与控制串后的参数列表中的输入输出目标,在个数与类型上必须一一对应的;
二、不同点:
a) scanf函数在参数列表中的每一项,必须是变量而不能是常量,而且必须对每一个变量取地址(数组除外);
b) printf函数在参数列表中的每一项,可以是变量也可以是常量或者其他表达式,而且即使是变量取地址或不取地址都是可以的;
c)printf函数参数列表中的变量,如果取地址打印的就是变量的地址,否则打印的就是变量内的数值。
d)scanf函数的控制串内只能有控制符与间隔符,而printf函数可以将各种文字与控制符混合在一起输出;
e)scanf函数的控制串内的控制符,或者参数列表内的变量个数至少是1个。而printf函数的控制串内的控制符个数,或者参数列表内的目标个数可以是0个,代表简单文字输出;

四、getchar、putchar、gets、puts 1.getchar(void)

得到的是数值类型数据
【返回值】函数的返回值为用户输入的第一个字符的ASCII码,若出错返回-1,且将用户输入的字符回显到屏幕

int in = getchar();  
putchar(in); 

如果用户在按回车键之前输入了不只一个字符,其他字符会保留在键盘缓冲区中,等待后续getchar()调用读取。也就是说,后续的getchat()调用不会等待用户按键,而是直接读取缓冲区中的字符,直到缓冲区的字符读取完毕后,才等待用户按键。

2.putchar(int ch)

输出的是一个字符
【参数】 ch为要输出的字符
【返回值】 输出成功,返回该字符的ASCII码值,否则返回EOF

putchar(97);   结果:a
putchar('A');  结果:A

char int short float double ch='A';
putchar(ch);  结果:A
3.gets(char *str)

只有一个参数,str 可以是一个字符指针变量名,也可以是一个字符数组名

char s[20];
gets(s);
4.puts(const char *s)

只能输出字符串,并且输出结束后会自动换行
s可以是字符指针变量名、字符数组名,或者直接是一个字符串常量

char s[]="做富人";
puts(s);
puts("做富人");

等价于
printf("%sn","做富人");

输出时只有遇到 ‘’ 也就是字符串结束标志符才会停止。

char s[]="做富人做富人";
puts(s);    //结果:做富人

如果 puts() 后面的参数是字符指针变量或字符数组,那么括号中除了字符指针变量名或字符数组名之外什么都不能写

char s[]="做富人"
puts(输出结果是:s);   //错误
puts(s);             // 正确

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5690962.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存