输入与输出

输入&输出

输出——printf()

转换说明要与数值类型相符;

转换说明个数要与,参数个数相符;

常用的转换说明

在printf()中没有%lf的定义

%c

字符

%d

十进制整型

%o

无符号八进制整型

%x(%X)

无符号十六进制整型

%f

浮点数

%s

字符串

%p

指针

常用的转换说明修饰符

标记

(-、+、空格、#、0)可以不使用标记或使用多个标记。例:%-2d

数字

最小字段宽度(如果该字段不能容纳待打印的数字或字符串,系统自动使用更宽的字段)。例:%4d

.数字

精度。例:%4.2 打印一个浮点数,字段宽度为4,小数点后有两位数字

        标记

-

待打印项左对齐(从字段最左侧开始打印)

+

有符号值,为正,值前加+;为负,值前加-

空格

有符号值,为正,值前加前导空格;为负,值前加-+空格

#

将结果转化为另一种形式。例:%#o 增加八进制前导,以0开始。(023(o)->19(d)) %#x 增加十六进制前导,以0x或0X开始。 (0x23(o)->35(d))

0

对于数值格式,用前导0代替空格填充字段宽度。对于整数格式,如果出现-或精度,则忽略该标记。

常用的转义序列

常用的转义序列

\a

警报

\b

退格

\f

换页

\n

换行

\r

回车

\t

水平制表符

\v

垂直制表符

\\

反斜杠

\'

单引号

\"

双引号

\?

在书写连续多个问号使用时,防止他们被解析成三字母词

\ddd

ddd表示1~3个八进制的数字。 如: \130

\xdd

dd表示2个十六进制数字。 如: \x30

#include<stdio.h>
int main()
{
    printf("%d\n",strlen("abcd"));
    //  \t  \328
    printf("%d\n",strlen("c:\test\328\test.c"));
    return 0;
}

返回值

返回所打印的字符数量,如果有输出错误则返回一个负值。

#include<stdio.h>
int main()
{
    printf("%d",printf("%d\n",printf("1234\n")));
    return 0;
}

输入——scanf()

输入实质为字符流

读取基本数据类型,变量名前加&;

读取字符串,变量名前不使用&;

读取时遇到空白字符停止;

会在第一个出错处停止读取;

转换说明修饰符

scanf()可以通过 l 修饰 %f 即 %lf 将数据存储为double类型

*

抑制赋值

数字

最大字段宽度。输入达到最大宽度时停止

scanf()函数允许将出空格以外的普通字符放入格式字符串中,但在输入时需要与格式字符串匹配;

scanf()角度看输入

假设scanf ()根据-个%d 转换说明读取-一个整数。

scanf ()函数每次读取-一个字符,跳过所有的空白字符,直至遇到第1个非空白字符才开始读取。

因为要读取整数,所以scanf ()希望发现-一个数字字符或者-一个符号(+或-)。

如果找到一个数字或符号,它便保存:该字符,并读取下一个字符。

如果下一一个字符是数字,它便保存该数字并读取下- -个字符。

scanf ()不断地读取和保存字符,直至遇到非数字字符。

如果遇到一个非数字字符,它便认为读到了整数的末尾。

然后,scanf ()把非数字字符放回输入。

这意味着程序在下一次读取输入时,首先读到的是上-次读取丢弃的非数字字符。

最后,scanf ()计算已读取数字(可能还有符号)相应的数值,并将计算后的值放入指定的变量中。

如果使用字段宽度, scanf ()会在字段结尾或第1个空白字符处停止读取(满足两个条件之一便停 止)。

如果第1个非空白字符是A而不是数字,会发生什么情况?

scanf ()将停在那里,并把A放回输入中,不会把值赋给指定变量。

程序在下一次读取输入时,首先读到的字符是A。如果程序只使用%d转换说明,scanf()就-直无法越过A读下一-个字符。

另外,如果使用带多个转换说明的scanf(), C规定在第1个出错处停止读取输入。

用其他数值匹配的转换说明读取输入和用%d的情况相同。

区别在于scanf()会把更多字符识别成数字的一部分。

例如, %x转换说明要求scanf ()识别十六进制数a~f和A~F。浮点转换说明要求scanf()识别小数点、e记数法(指数记数法)

和新增的p记数法(十六进制指数记数法)。

如果使用%s转换说明,scanf ()会读取除空白以外的所有字符。

scanf ()跳过空白开始读取第1个非空白字符,并保存非空白字符直到再次遇到空白。

这意味着scanf ()根据%s转换说明读取一个单词,即不包含空白字符的字符串。

如果使用字段宽度,scanf() 在字段末尾或第1个空白字符处停止读取。

无法利用字段宽度让只有一个%s的scanf()读取多个单词。

最后要注意一点:当scanf ()把字符串放进指定数组中时,它会在字符序列的末尾加上'\0',让数组中的内容成为一个C字符串。

getchar()

通过键盘键入获取一个字符(所有字符)

putchar()

输出字符

gets()

通过键盘键入获取字符串

char ch;
ch=getchar();
putchar(ch);
#include<stdio.h>       //读取带空格的字符串,代码实现
int main()
{
    char str[100];
    while((ch[i]=getchar())!='\n')
    {
        i++;    
    }
    str=gets();
    return 0;
}

格式字符串中的普通字符

scanf()函数允许把函数普通字符放在格式字符串中。除空格字符外的;普通字符必须与输入字符串严格匹配。

除%c,其他转换说明都会自动跳过带输入值前面所有的空白

scanf("%d,%d",&n,&m);

8,21 (1.0)

8, 21 (2.0)

8,

21 (3.0)

scanf("%d%d",&n,&m)
//等价于
scanf("%d %d",&n,&m)

返回值

返回成功读取的项数;当scanf()检测到文件结尾时会返回EOF;

输入验证

/*
输入一个数字
***数值大于0
***输入错误后重新输入
*/
#include<stdio.h>    
int main()
{
    int n;
    char ch;
    while(scanf("%d",&n)!=1&&n<1)             //根据scanf()返回值判断输入是否与转换说明相同
    {		  //如果不符,输入字符就会停留在队列。下一次scanf()直接吸收队列中的错误字符
            while((ch=getchar())!='\n')        //通过getchar()吸收队列中的错误字符,
            {
                continue;            
            }
            scanf("%d",&n);
    }
}

最难不过坚持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值