标准I/O-1-getchar,scanf,gets,fgets,puts,fputs,格式控制

来源:互联网 发布:sql 遍历select结果 编辑:程序博客网 时间:2024/05/27 20:50
重点:scanf(),getchar(),gets(),fgets()


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:

[cpp] view plaincopy
  1. #include <stdio.h>  
  2. int main()  
  3. {  
  4.     char str1[10];  
  5.     char str2[10];  
  6.     char ch1, ch2, ch3;//  
  7.     scanf("%s",str1);  
  8.     ch1 = getchar();//'\n'  
  9.     printf("%d", ch1);//  
  10.     ch2 = getchar();//'a'  
  11.     printf("%d", ch2);//  
  12.     scanf("%s",str2);  
  13.     ch3 = getchar();//'\n'  
  14.     printf("%d", ch3);//  
  15.     printf("str1=%s,str2=%s\n",str1,str2);  
  16.     return 0;  
  17. }  

运行结果1:
<abcEnter>
10<abcEnter>
9710str1=abc,str2=bc

运行结果2:
<abc abc Enter>
329732str1=abc,str2=bc

 

例程2:

[cpp] view plaincopy
  1. #include <stdio.h>  
  2. int main()  
  3. {  
  4.     char str1[10];  
  5.     char str2[10];  
  6.     char ch1, ch2;  
  7.     scanf("%s",str1);  
  8.     scanf("%s",str2);  
  9.     ch1 = getchar();//'\n'  
  10.     printf("%d", ch1);  
  11.     ch2 = getchar();//等待输入  
  12.     printf("%d", ch2);  
  13.     printf("str1=%s,str2=%s\n",str1,str2);  
  14.     return 0;  
  15. }  


运行结果:
<abcEnter>
<abcEnter>
10<Enter>
10str1=abc,str2=abc

总结:
①当输入字符串时,scanf用Enter结束输入之后,会在缓冲区留下一个'\n'(ASCII码为10);
②当输入字符串时,连续执行2个scanf(都用Enter结束输入),只会留下一个'\n';
③当输入字符串时,空格、Tab、Enter都可以作为scanf的分隔符,但是只有按下Enter之后,缓冲区中的字符串才被取走;


例程3:

[cpp] view plaincopy
  1. #include <stdio.h>  
  2. int main()  
  3. {  
  4.     char str1[10];  
  5.     int a1;  
  6.     char ch1, ch2;  
  7.     scanf("%s", str1);  
  8.     scanf("%c", &ch1);  
  9.     scanf("%d", &a1);  
  10.     scanf("%c", &ch2);  
  11.     printf("str1=%s,ch1=%d,a1=%d,ch2=%d\n", str1, ch1, a1, ch2);  
  12.   
  13.     return 0;  
  14. }  

运行结果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')

例程:

[cpp] view plaincopy
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. int main()  
  4. {  
  5.     char str[11];  
  6.     char* sp;  
  7.     printf("Please input a string:");  
  8.     sp = fgets(str, 11, stdin);  
  9.     if(sp == NULL)  
  10.     {  
  11.             printf("error!\n");  
  12.             exit(0);  
  13.     }  
  14.     printf("%s\n", sp);  
  15.     printf("%s\n", str);  
  16.     char ch1;  
  17.     ch1 = getchar();  
  18.     printf("%d\n", ch1);  
  19.     int i;  
  20.     for(i = 0; str[i] != '\0'; i++ )  
  21.     {  
  22.             printf("%d|", str[i]);  
  23.     }         
  24.     printf("%d|", str[i]);  
  25.     printf("over\n");  
  26.     return 0;  
  27. }  

运行结果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'的处理)

[cpp] view plaincopy
  1. #include <stdio.h>  
  2. int main()  
  3. {  
  4.     char str1[101], str2[101];  
  5.     fgets(str1, 101, stdin);  
  6.     fgets(str2, 101, stdin);  
  7.     printf("%s\n", str1);  
  8.     printf("%s\n", str2);  
  9.     return 0;  
  10. }  
  11. #include <stdio.h>  
  12. int main()  
  13. {  
  14.     char str1[101], str2[101];  
  15.     gets(str1);  
  16.     gets(str2);  
  17.     printf("%s\n", str1);  
  18.     printf("%s\n", str2);  
  19.     return 0;  
  20. }  


输入时,粘贴如下内容:
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
例:以#作为分隔符

[cpp] view plaincopy
  1. #include <stdio.h>  
  2. int main(void)  
  3. {  
  4.     char str1[21], str2[21];  
  5.     scanf("%[^#]s", str1);  
  6.     getchar();//吸收’#‘  
  7.     scanf("%s", str2);  
  8.     printf("%s%s\n", str1, str2);  
  9.     return 0;  
  10. }  

 


puts()和fputs()的对比

原型:
int puts(const char *s);
int fputs(const char *s, FILE *stream);

返回值:
puts成功返回字符个数,fputs成功返回非负数;失败返回EOF(-1)

例程1:

[cpp] view plaincopy
  1. #include <stdio.h>  
  2. int main()  
  3. {  
  4.     int n1, n2;  
  5.     n1 = fputs("1234567\n", stdout);  
  6.     n2 = puts("1234567\n");  
  7.     printf("n1=%d, n2=%d\n", n1, n2);  
  8.     return 0;  
  9. }  

运行结果:
1234567
1234567

n1=1, n2=9

例程2:

[cpp] view plaincopy
  1. #include <stdio.h>  
  2. int main()  
  3. {  
  4.     int n1, n2;  
  5.     n1 = puts("1234567\n");  
  6.     n2 = fputs("1234567\n", stdout);  
  7.     printf("n1=%d, n2=%d\n", n1, n2);  
  8.     return 0;  
  9. }  

运行结果:
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

 specifierslengthd iu o x Xf F e E g G a Acspn(none)intunsigned intdoubleintchar*void*int*hhsigned charunsigned char    signed char*hshort intunsigned short int    short int*llong intunsigned long int wint_twchar_t* long int*lllong long intunsigned long long int    long long int*jintmax_tuintmax_t    intmax_t*zsize_tsize_t    size_t*tptrdiff_tptrdiff_t    ptrdiff_t*L  long double    http://www.cplusplus.com/reference/cstdio/printf/


特殊的输入格式控制符:

指定输出位宽和小数位数:
%m.df
%-m.nf:左靠齐
%.nf:只指定小数位数


EOF

[cpp] view plaincopy
  1. #include <stdio.h>  
  2. int main()  
  3. {  
  4.     printf("%d\n", EOF);  
  5.     return 0;  
  6. }  


运行结果:
-1

0 0
原创粉丝点击