代码改变世界

关于c语言的几个输入输出函数的问题

2016-06-08 11:57  小竹心语  阅读(378)  评论(0编辑  收藏  举报

1 scanf()    getchar()

 1 #include <stdio.h>
 2     int main()
 3     {
 4  char ch1, ch2;
 5  scanf("%c", &ch1); 
 6  scanf("%c", &ch2);
 7  printf("%d  %d\n", ch1, ch2);
 8  return 0;
 9     }
10    
11 
12     #include <stdio.h>
13     int main()
14     {
15  char ch1, ch2;
16  ch1 = getchar();
17  ch2 = getchar();
18  printf("%d  %d\n", ch1, ch2);
19  return 0;
20     }

    函数1

这两个程序的运行效果是一样的,比如我输入1个1,就直接给我说出 49 10,根本没有等我输入第二个字符。

原因:scanf 和getchar会把回车当做一个字符给读出来 而10正好就是回车的asc码

 

 

 

改进方法:

#include <stdio.h>
    int main()
    {
 char ch1, ch2;
 scanf("%c", &ch1); 
while(getchar()!='\n');//清空输入缓存区
 scanf("%c", &ch2);
 printf("%d  %d\n", ch1, ch2);
 return 0;
    }


    #include <stdio.h>
    int main()
    {
 char ch1, ch2;
 ch1 = getchar();
while(getchar()!='\n');
 ch2 = getchar();
 printf("%d  %d\n", ch1, ch2);
 return 0;
    }

  函数2

改进后就可以正常的输入2个字符,然后打印出他们的asc码

 

再来讨论下scanf 和getchar

还是函数1 当我们输入几个空格,然后输入1个1,最后按回车后,打印出来的是2个32 (scanf 和getchar 相同)

再来试一试函数2 当我们从键盘输入几个空格 然后输入1个1,然后按回车,接着再输入1个2 再按回车 最后输入1个32  1个50

 

总结,我们从键盘上输入是以回车结束的,而scanf或者是getchar从输入缓存区中读取,是以回车 空格 tab键结束的。

 

 

 

接下来来看看scanf和gets 输入字符串

 1 #include <stdio.h>
 2 
 3 int main()
 4     {
 5  char str1[20], str2[20];
 6  scanf("%s",str1); 
 7  printf("%s\n",str1);    
 8  scanf("%s",str2);  
 9  printf("%s\n",str2);  
10  return 0;
11     }
12 
13     程序3

测试运行:1 当我们输入123 然后在输入几个空格个数随意 再输入1个12  最后按回车

结果就直接输出123 和12 了

      2 当我们输入123,然后输入几个tab键(个数随意) 再输入1个12 最后按回车

结果就直接输入123 和12 了

总结1:scanf遇到空格或者是tab键就结束输入了,即空格或者是tab后面的东西他是读不到的

     2:scanf每次读取数据都会忽略掉开头的空格和tab

 

还是程序3 当我们输入123,按回车,他就直接输出12 再输入12,回车,他就输出12

总结:scanf遇到回车就直接结束了,上面的程序执行了2次从键盘读入字符串,说明第一次从键盘读入的回车符被丢弃了,

即scanf读取字符串后丢弃最后的回车符。

 

接下来说说gets

显然当要输入的字符串带空格或者是tab键时,用scanf是不合适的,这时我们就要使用gets

 1 int main()
 2 {
 3  char str1[20], str2[20];
 4  gets(str1); 
 5  printf("%s\n",str1);    
 6  gets(str2);  
 7  printf("%s\n",str2);  
 8  return 0;
 9 }
10 
11 程序4

测试:
Hello world! [输入]
Hello world! [输出]
12345 [输入]
12345 [输出]

 

最后,来说说printf和puts的区别

 

 1  int main()
 2      {
 3    char str1[20], str2[20];
 4    scanf("%s",str1); 
 5   printf("%s",str1);    
 6    scanf("%s",str2);  
 7    printf("%s",str2);  
 8   return 0;
 9      }
10 
11 测试1
12 
13 
14 int main()
15      {
16    char str1[20], str2[20];
17    scanf("%s",str1); 
18   printf("%s\n",str1);    
19    scanf("%s",str2);  
20    printf("%s\n",str2);  
21   return 0;
22      }
23 测试2
24 
25 
26 int main()
27       {
28    char str1[20], str2[20];
29    scanf("%s",str1); 
30    puts(str1);    
31    scanf("%s",str2);  
32    puts(str2);  
33   return 0;
34      }
35 测试3

当先输入12   qw   然后就输出12   qw

再输入ww dc  输出 ww dc

两者遇到空格,tab都不会停下来 都是以 '\n' 作为结束的

唯一的区别是puts会自动换行,而使用printf如果想换行必须加上换行符 '\n'

 

结束