zoukankan      html  css  js  c++  java
  • 关于c语言的几个输入输出函数的问题

    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
    ", 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
    ", 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()!='
    ');//清空输入缓存区
     scanf("%c", &ch2);
     printf("%d  %d
    ", ch1, ch2);
     return 0;
        }
    
    
        #include <stdio.h>
        int main()
        {
     char ch1, ch2;
     ch1 = getchar();
    while(getchar()!='
    ');
     ch2 = getchar();
     printf("%d  %d
    ", 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
    ",str1);    
     8  scanf("%s",str2);  
     9  printf("%s
    ",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
    ",str1);    
     6  gets(str2);  
     7  printf("%s
    ",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
    ",str1);    
    19    scanf("%s",str2);  
    20    printf("%s
    ",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都不会停下来 都是以 ' ' 作为结束的

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

    结束

  • 相关阅读:
    List、Set、Map集合大杂烩
    Android的DatePicker和TimePicker-android学习之旅(三十八)
    Ubuntu 启动项、菜单 改动 防止隐藏
    Ehcache 整合Spring 使用页面、对象缓存
    Spring MVC 相关资料整理
    Spring + Spring MVC+Hibernate框架整合详细配置
    @RequestMapping 用法详解之地址映射
    关于时间统计问题
    Oracle之物化视图
    Oracle:高效插入大量数据经验之谈
  • 原文地址:https://www.cnblogs.com/tiantiantian-dianzi/p/5569616.html
Copyright © 2011-2022 走看看