C语言 输入输出

输出

printf

发送格式化输出到标准输出 stdout

调用格式

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

头文件

stdio.h

声明

int printf(const char *format,...)

参数

format -- 是字符串,包含要被写入到标准输出 stdout 的文本。可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。format 标签属性是 %[flags][width][.precision][length]specifier,具体讲解如下:

打印%符号时,需要使用两个%%

附加参数 -- 根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含一个要被插入的值,替换 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。

返回值

如果成功,返回写入的字符总数,否则返回一个负数

转义字符

putchar

头文件

stdio.h

声明

int putchar(int char)

调用格式

putchar(c);

  • 当c为一个被单引号(英文状态下)引起来的字符时,输出该字符(注:该字符也可为转义字符)
  • 当c为一个介于0~127(包括0及127)之间的十进制整型数时,它会被视为对应字符的ASCII代码,输出该ASCII代码对应的字符
  • 当c为一个事先用char定义好的字符型变量时,输出该变量所指向的字符

作用

把参数 char 指定的字符(一个无符号字符)写入到标准输出 stdout 中。其输出可以是一个字符,可以是介于0~127之间的一个十进制整型数(包含0和127),也可以是用char定义好的一个字符型变量。

返回值

输出正确时,返回输出字符转换为的 unsigned int 值

输出错误时,返回 EOF 文件结束符

puts

用于显示字符串,而且自动在显示的字符串末尾加上换行符

把字符串的地址作为参数传递给该函数即可使用

如何知道在何处停止?该函数在遇到空字符时就停止输出,所以必须确保有空字符。

fputs

fputs(str,stream);第一个参数是一个数组,包含要写入的以空字符终止的字符序列,第二个参数是指针,标识了要被写入字符串的流,当要打印在显示器上时,用定义在 stdout 作为该参数

fputs()和puts()的区别

1.fputs()函数的第 2 个参数指明要写入数据的文件。如果要打印在显示器上,可以用定义在stdio.h中的stdout(标准输出)作为该参数。

2.与puts()不同,fputs()不会在输出的末尾添加换行符。

注意,gets()丢弃输入中的换行符,但是puts()在输出中添加换行符。另一方面,fgets()保留输入中的换行符,fputs()不在输出中添加换行符。

输入

scanf

从标准输入流 stdin 中读取格式化输入

调用格式

scanf(格式化字符串,参数列表);

不要在 scanf 的格式化字符串的最后加 \n

头文件

stdio.h

声明

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

参数

format -- 这是 C 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符 和 format 说明符。format 说明符形式:[=%[*][width][modifiers]type=],具体讲解如下:

scanf 类型说明符:

附加参数 -- 根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。

返回值

如果成功,该函数返回成功匹配和赋值的个数,如果达到文件末尾或发生读错误,则返回 EOF

注意

  • %d%d%d 是按十进值格式输入三个数值。输入时,在两个数据之间可以用一个或多个空格、tab 键、回车键分隔。如果使用 ,来分隔输入的 %d, 相应的输入时也需要添加 ,,输入时,前一定要紧跟在数字后面,数字与,之间不能有空格。
  • 用%c输入时,空格和“转义字符”均作为有效字符

因为格式控制符之间没有空格,但是在输入时却输入了空格,使得读取时,先读取了第一个字符A,将其赋给a,然后再读取第二个字符时,继续读取,读取到下一个字符——空格,并将其赋给变量b

  • 格式控制符间有空格

两个格式控制符间出现空格,对变量的读取、存储不会影响,即,无论格式控制符是否存在空格,输入时均可输入无限多个空格,都可以被成功读取

  • 格式控制个数与地址表列不同
    • 如果地址表列个数多余格式控制,则只在缓冲区提取格式符个数个数据,多出的地址表列没有结果赋值,输出初始值
    • 如果格式控制个数多余地址表列,则在VS中报错,Dev C++ 中只录入地址表列个数个值

输入终止条件

  1. 遇 回车、跳格、空格
  2. 遇宽度结束
  3. 遇非法输入

getchar()

无参数,从输入队列中返回下一个字符

头文件

stdio.h

参数

无参数

声明

int getchar(void)

作用

读取字符。

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

返回值

返回用户输入的第一个字符的 ASCII 码,若出错返回 -1,且将用户输入的字符回显到屏幕。

gets

可以读取一整行输入,而不仅仅是一个单词。gets()函数简单易用,它读取整行输入,直至遇到换行符,然后丢弃换行符,存储其余字符,并在这些字符的末尾添加一个空字符使其成为一个C字符串。

只知道数组的开始处,并不知道数组中有多少个元素。如果输入的字符串过长,会导致缓冲区溢出,即多余的字符超出了指定的目标空间。

fgets

用fgets()来代替gets(),fgets()函数稍微复杂些,在处理输入方面与gets()略有不同。

通过第二个参数(指明它要写入的参数)限制读入的字符数来解决溢出问题。还函数专门设计用于处理文件输入,所以一般情况下可能不太好用。

fgets()和gets()的区别:

1.fgets()函数的第2个参数指明了读入字符的最大数量。如果该参数的值是n,那么fgets()将读入n-1个字符(第n个字符是空字符),或者读到遇到的第一个换行符为止。

2.如果fgets()读到一个换行符,会把它储存在字符串中。这点与gets()不同,gets()会丢弃换行符。

3.fgets()函数的第3 个参数指明要读入的文件。如果读入从键盘输入的数据,则以stdin(标准输入)作为参数,该标识符定义在stdio.h中。

char ch[10];

fgets(ch,n,stdin);//实际接收n-1个字符,第n个字符是空字符。

fgets()函数返回指向char的指针。如果一切进行顺利,该函数返回的地址与传入的第一个参数相同。但是,如果函数读到文件结尾,它将返回一个特殊的指针:空指针。该指针保证不会指向有效的数据,所以可用于标识这种特殊情况。在代码中,可以用数字0代替,不过在C语言中用宏NULL来代替更常见(如果在读入数据时出现某些错误,该函数也返回NULL)。

fgets()存储换行符有好处也有坏处。坏处是你可能并不想把换行符存储在字符串中,这样的换行符会带来一些麻烦。好处是对于存储的字符串而言,检查末尾是否有换行符可以判断是否读取了一整行。如果不是一整行,要妥善处理一行中剩下的字符。

如何处理掉换行符?一个方法是在已存储的的字符串中查找换行符,并将其代替成空字符。

如果仍有字符串留在输入行怎么办?一个可行的办法是,如果目标数组装不下一整行输入,就丢弃那些多出的字符

gets_s

C11新增的gets_s函数也可代替gets(),且该函数与gets()函数更接近,而且可以代替现有代码中的gets()。用一个参数限制读入的字符数。

gets_s()与fgets()的区别:

1.gets_s()只从标准输入中读取数据,所以不需要第3个参数。

2.如果gets_s()读到换行符,会丢弃它而不是储存它。

3.如果gets_s()读到最大字符数都没有读到换行符,会执行以下几步。首先把目标数组中的首字符设置为空字符,读取并丢弃随后的输入直至读到换行符或文件结尾,然后返回空指针。接着,调用依赖实现的“处理函数”(或你选择的其他函数),可能会中止或退出程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何hyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值