标准I/O-1-getchar,scanf,gets,fgets,puts,fputs,格式控制
来源:互联网 发布:sql 遍历select结果 编辑:程序博客网 时间:2024/05/27 20:50
getchar()
原型:int getchar(void);作用:从stdin中获取一个字符
返回值:returns it as an unsigned char cast to an int, or EOF on end of file or error.
注意:
①可以获取非输出字符(如' ',' ','\n')
-----getchar()与Enter留下的'\n'
例:获取一个字符给ch
无论多少次Enter,最多只会留下一个'\n',所以可以这样解决:
if( (ch = getchar()) == '\n' )
{
ch = getchar();
}
scanf()和getchar()的对比
例程1:- #include <stdio.h>
- int main()
- {
- char str1[10];
- char str2[10];
- char ch1, ch2, ch3;//
- scanf("%s",str1);
- ch1 = getchar();//'\n'
- printf("%d", ch1);//
- ch2 = getchar();//'a'
- printf("%d", ch2);//
- scanf("%s",str2);
- ch3 = getchar();//'\n'
- printf("%d", ch3);//
- printf("str1=%s,str2=%s\n",str1,str2);
- return 0;
- }
运行结果1:
<abcEnter>
10<abcEnter>
9710str1=abc,str2=bc
运行结果2:
<abc abc Enter>
329732str1=abc,str2=bc
例程2:
- #include <stdio.h>
- int main()
- {
- char str1[10];
- char str2[10];
- char ch1, ch2;
- scanf("%s",str1);
- scanf("%s",str2);
- ch1 = getchar();//'\n'
- printf("%d", ch1);
- ch2 = getchar();//等待输入
- printf("%d", ch2);
- printf("str1=%s,str2=%s\n",str1,str2);
- return 0;
- }
运行结果:
<abcEnter>
<abcEnter>
10<Enter>
10str1=abc,str2=abc
总结:
①当输入字符串时,scanf用Enter结束输入之后,会在缓冲区留下一个'\n'(ASCII码为10);
②当输入字符串时,连续执行2个scanf(都用Enter结束输入),只会留下一个'\n';
③当输入字符串时,空格、Tab、Enter都可以作为scanf的分隔符,但是只有按下Enter之后,缓冲区中的字符串才被取走;
例程3:
- #include <stdio.h>
- int main()
- {
- char str1[10];
- int a1;
- char ch1, ch2;
- scanf("%s", str1);
- scanf("%c", &ch1);
- scanf("%d", &a1);
- scanf("%c", &ch2);
- printf("str1=%s,ch1=%d,a1=%d,ch2=%d\n", str1, ch1, a1, ch2);
- return 0;
- }
运行结果1:
<abcEnter>
<3Enter>
str1=abc,ch1=10,a1=3,ch2=10
运行结果2:
<abc 3Enter>
str1=abc,ch1=32,a1=3,ch2=10
总结:
④当输入字符时(不是字符串),scanf的作用同getchar,也能获取空格、Tab、Enter留下的'\n';
putchar()
原型:int putchar(int c);作用:向stdout输出一个字符
返回值:return the character written as an unsigned char cast to an int or EOF on error.
正确返回...;错误返回EOF
gets()【漏洞】
gcc报出的警告:warning: the 'gets' function is dangerous and should not be used.原型:char *gets(char *s);
作用:读取一行字符,遇到'\n'结束
返回值:成功返回s指针;失败返回NULL指针
注意:不会读取'\n',但是会清除'\n'
fgets()
原型:char *fgets(char *s, int size, FILE *stream);返回值:成功返回s指针;失败返回NULL指针
作用:读取一行字符,如下情况结束读取:①size;②'\n'(和gets不同的是,如果size空间有限,会读取'\n')
例程:
- #include <stdio.h>
- #include <stdlib.h>
- int main()
- {
- char str[11];
- char* sp;
- printf("Please input a string:");
- sp = fgets(str, 11, stdin);
- if(sp == NULL)
- {
- printf("error!\n");
- exit(0);
- }
- printf("%s\n", sp);
- printf("%s\n", str);
- char ch1;
- ch1 = getchar();
- printf("%d\n", ch1);
- int i;
- for(i = 0; str[i] != '\0'; i++ )
- {
- printf("%d|", str[i]);
- }
- printf("%d|", str[i]);
- printf("over\n");
- return 0;
- }
运行结果1:
Please input a string:<1234567890Enter>
1234567890
1234567890
10
49|50|51|52|53|54|55|56|57|48|0|over
运行结果2:
Please input a string:<123456789Enter>
123456789
123456789
<1Enter>
49
49|50|51|52|53|54|55|56|57|10|0|over
运行结果3:
Please input a string:<12345678901Enter>
1234567890
1234567890
49
49|50|51|52|53|54|55|56|57|48|0|over
结果分析:
1、缓冲区的字符串为:<1234567890\n>
fgets获取的字符串为:<1234567890>\0(自补'\0')
留下的字符(串)为:<\n>
2、缓冲区的字符串为:<123456789\n>
fgets获取的字符串为:<123456789>\0(自补'\0')
留下的字符(串)为:无(所以遇到getchar时要等待输入)
3、缓冲区的字符串为:<12345678901\n>
fgets获取的字符串为:<1234567890>\0(自补'\0')
留下的字符(串)为:<1\n>
总结:
①char *fgets(char *s, int size, FILE *stream)这里的size是包含'\0'的,也是就str[x]中x是多少,size的最大值就是多少;
②fgets可以获取'\n';
③fgets执行完后,多余的字符(串)还会留在缓冲区,包括'\n'
gets()和fgets()的对比(对'\n'的处理)
- #include <stdio.h>
- int main()
- {
- char str1[101], str2[101];
- fgets(str1, 101, stdin);
- fgets(str2, 101, stdin);
- printf("%s\n", str1);
- printf("%s\n", str2);
- return 0;
- }
- #include <stdio.h>
- int main()
- {
- char str1[101], str2[101];
- gets(str1);
- gets(str2);
- printf("%s\n", str1);
- printf("%s\n", str2);
- return 0;
- }
输入时,粘贴如下内容:
hahhah hahah h
hahh hah
总结:
①gets()不会吸收'\n',但是会清除缓冲区中'\n'(下次的函数就不会遇到'\n');
②fgets()如果size值允许读到'\n','\n'也会被吸走;
③scanf()既不吸收'\n',也不清除'\n'(下次的函数会遇到)
scanf()和gets()的对比(分隔符)
scanf("%s", str)遇到空格、Tab、Enter都结束gets(str)遇到空格、Tab不结束,遇到Enter结束
应用情景:
1、以空格、Tab作为分隔符,则用scanf()
2、以其他符号(除空格、Tab、Enter以外)作为分隔符,则用scanf
例:以#作为分隔符
- #include <stdio.h>
- int main(void)
- {
- char str1[21], str2[21];
- scanf("%[^#]s", str1);
- getchar();//吸收’#‘
- scanf("%s", str2);
- printf("%s%s\n", str1, str2);
- return 0;
- }
puts()和fputs()的对比
原型:int puts(const char *s);
int fputs(const char *s, FILE *stream);
返回值:
puts成功返回字符个数,fputs成功返回非负数;失败返回EOF(-1)
例程1:
- #include <stdio.h>
- int main()
- {
- int n1, n2;
- n1 = fputs("1234567\n", stdout);
- n2 = puts("1234567\n");
- printf("n1=%d, n2=%d\n", n1, n2);
- return 0;
- }
运行结果:
1234567
1234567
n1=1, n2=9
例程2:
- #include <stdio.h>
- int main()
- {
- int n1, n2;
- n1 = puts("1234567\n");
- n2 = fputs("1234567\n", stdout);
- printf("n1=%d, n2=%d\n", n1, n2);
- return 0;
- }
运行结果:
1234567
1234567
n1=9, n2=1
总结:
①puts会自动加上'\n',所以返回值比参数中的字符串长度大1;
②puts和fputs返回值的差别;
常用的格式控制符
输入和输出:int: d
long: ld
long long: lld
unsigned int: u
unsigned long: lu
unsigned long long: llu
double: lf
指针: p
八进制: o
十六进制: x,X
特殊的输入格式控制符:
指定输出位宽和小数位数:
%m.df
%-m.nf:左靠齐
%.nf:只指定小数位数
EOF
- #include <stdio.h>
- int main()
- {
- printf("%d\n", EOF);
- return 0;
- }
运行结果:
-1
- 标准I/O-1-getchar,scanf,gets,fgets,puts,fputs,格式控制
- C 输入、输出库函数学习总结(printf & scanf, gets & puts, fgets & fputs, getchar & putchar)
- fgets,fputs,gets,puts
- fgets gets fputs puts
- fgets,fputs,gets,puts
- fgets,fputs,gets,puts
- fgets,fputs,gets,puts
- gets、puts、fgets、fputs
- gets、fgets、puts、fputs、scanf、read、readline、getline等
- scanf/gets/puts/fgets
- fgets/gets, fputs/puts区别
- fgets、gets与fputs、puts
- fgetc fputc fgets fputs fprintf fscanf getc getchar gets putc putchar puts ungetc函数介绍
- fgetc fputc fgets fputs fprintf fscanf getc getchar gets putc putchar puts ungetc函数介绍
- gets()、puts()和fgets()、fputs() 的区别。
- scanf/printf/getchar/putchar/gets/puts/
- 字符串的输入和输出(认识gets()fgets()scanf()和puts()fputs()printf()) ---CCS常用STDIO
- 字符串读写函数gets() 、puts()、fgets()和fputs()
- linux下解压命令大全
- Java synchronized详解
- 算法摘记 线段树
- WAP、触屏版网站及APP的区别
- 环境:QT Create 快捷键
- 标准I/O-1-getchar,scanf,gets,fgets,puts,fputs,格式控制
- SAS学习笔记之自动发邮件
- informatica ETL开发过程
- 浮点数的大小比较
- Linux-HA开源软件Heartbeat(概念篇)
- 三城记:中国创客地图
- HDU 5015 2014 ACM/ICPC Asia Regional Xi'an Online 233 Matrix
- 工业水处理工程:威立雅工业污水处理工程用到新型交换膜
- Android实现左右滑动指引效果