基本的输入输出函数介绍

声明:以下内容,在linux系统下操作的,编译器为gcc.

 

scanf()函数:

当控制字符为 %c 时,它会读入你输入的空格、回车等键的;

当用%d 时:默认分隔符(分隔也是结束的标志嘛)是所有的 white-spaces(空格、回车、制表);

     注意:1. 输入时,应该用空格或着 制表符分开,不能用;或,哦;

             2. 如果要用的话,你的输入应该与  scanf函数中的控制串能对应起来。否则的话,它就只会读入一部分正确的,然后退出。

               比如: scanf(“%d, %d”,&a, &b);,  当我们输入时,也应该是这样的,如:23,45;如果输入为23 45 的话,那么它只会正确读入 a=23,然后就停止了,即正确读入了一个数;

             3. 或着:scanf("%d%*c%d",&x,&y), %*表示读取指定类型的数据c(表示字符)但是不保存。这样的话,就可以用你想用的字符进行分隔了;

当控制符为 %s 时,默认分隔符(分隔也是结束的标志嘛)是所有的 white-spaces,输入后自动加入结束符"\0"。

 

补充:

1. 数对于 scanf()函数,它的读入问题就要涉及到了缓冲区了。scanf函数是以删除的方式从缓冲区读取数据(缓冲区中存储来自标准输入的数据)。如果缓冲区是空的,就阻塞之,等待从键盘输入;并且scanf还能对数字输入忽略先导的空白符,如\n\t和空格等(注意,对字符输入并不忽略先导字符,这个也是很自然的道理,因为\n\t和空格在字符中都是合法的字符)。

2. scanf() 是有返回值的,它的返回值为正确读入的变量的数目;

 

getchar()函数:

经过我的实现,我的结论为:getchar()函数从缓冲区读取一个字符,它什么时候读取呢,只要缓冲区里进入回车(有的系统换行,反正吧我的linux下为换行)以后它就会读取。它的返回值为什么呢?为读取字符的 ASCII的值;下面是我实现程序:

// 源码:
1 #include<stdio.h>
  2 int main() {
  3         int a;
  4         printf("hello,world\n");
  5         scanf("%d", &a);
  6         printf("%d\n",a);
  7         printf("%d\n", getchar());
  8         printf("%d\n", getchar());
  9         printf("%d\n", getchar());
 10         printf("%d\n", getchar());
 11         printf("%d\n", getchar());                                          
 12         printf("i am \n");
 13         printf("hello,world\n");
 14         printf("hello,world\n");
 15         printf("hello,world\n");
 16  
 17         return 0;
 18 }

//输出:
hello,world
24               //阻塞中,然后输入24;
24
10                //这个10吧,对应在linux下的换行的ASCII的值;
a                //阻塞中,然后输入a;
97
10        
b                //阻塞中,然后输入b;
98
10
i am 
hello,world
hello,world
hello,world

 

还一一个getch函数,它吧,不在C标准库中,我们其实用getchar()就可以了吧。

 

gets()与fgets()函数:

对于gets()函数,gcc下直接没法用,因为它不安全,可以导致程序崩溃,改用fgets()函数;

头文件:include<stdio.h>
fgets()函数用于从文件流中读取一行或指定个数的字符,其原型为:
    char * fgets(char * string, int size, FILE * stream);
参数说明:

  • string为一个字符数组,用来保存读取到的字符。
  • size为要读取的字符的个数。如果该行字符数大于size-1,则读到 size-1 个字符时结束,并在最后补充' \0';如果该行字符数小于等于 size-1,则读取所有字符,并在最后补充 '\0'。即,每次最多读取 size-1 个字符。
  • stream为文件流指针。

【返回值】读取成功,返回读取到的字符串,即string;失败或读到文件结尾返回NULL。因此我们不能直接通过fgets()的返回值来判断函数是否是出错而终止的,应该借助feof()函数或者ferror()函数来判断。
注意:fgets()与gets()不一样,不仅仅是因为gets()函数只有一个参数 FILE *stream,更重要的是,fgets()可以指定最大读取的字符串的个数,杜绝了gets()使用不当造成缓存溢出的问题。

1 #include<stdio.h>
  2 int main() {
  3         char str[10];
  4         fgets(str, 10, stdin);
  5         printf("%s\n", str);                                                
  6 
  7         return 0;
  8 }

输出:

yinheyi@ubuntu:~/learn/c_language/1$ ./test.out 
asd
asd

yinheyi@ubuntu:~/learn/c_language/1$ ./test.out 
safdsdafsdaaaaaaaa
safdsdafs

 

 

 

文件的读取:

 

 

 

 

 

ASCII 表:

0000 0000     0     00     NUL     ␀     ^@     空字符(Null)
0000 0001     1     01     SOH     ␁     ^A     标题开始
0000 0010     2     02     STX     ␂     ^B     本文开始
0000 0011     3     03     ETX     ␃     ^C     本文结束
0000 0100     4     04     EOT     ␄     ^D     傳輸结束
0000 0101     5     05     ENQ     ␅     ^E     请求
0000 0110     6     06     ACK     ␆     ^F     確認回應
0000 0111     7     07     BEL     ␇     ^G     响铃
0000 1000     8     08     BS     ␈     ^H     退格
0000 1001     9     09     HT     ␉     ^I     水平定位符號
0000 1010     10     0A     LF     ␊     ^J     换行键
0000 1011     11     0B     VT     ␋     ^K     垂直定位符號
0000 1100     12     0C     FF     ␌     ^L     换页键
0000 1101     13     0D     CR     ␍     ^M     Enter鍵
0000 1110     14     0E     SO     ␎     ^N     取消變换(Shift out)
0000 1111     15     0F     SI     ␏     ^O     启用變换(Shift in0001 0000     16     10     DLE     ␐     ^P     跳出数据通讯
0001 0001     17     11     DC1     ␑     ^Q     設備控制一(XON 啟用軟體速度控制)
0001 0010     18     12     DC2     ␒     ^R     設備控制二
0001 0011     19     13     DC3     ␓     ^S     設備控制三(XOFF 停用軟體速度控制)
0001 0100     20     14     DC4     ␔     ^T     設備控制四
0001 0101     21     15     NAK     ␕     ^U     確認失敗回應
0001 0110     22     16     SYN     ␖     ^V     同步用暫停
0001 0111     23     17     ETB     ␗     ^W     區塊傳輸结束
0001 1000     24     18     CAN     ␘     ^X     取消
0001 1001     25     19     EM     ␙     ^Y     連線介质中断
0001 1010     26     1A     SUB     ␚     ^Z     替換
0001 1011     27     1B     ESC     ␛     ^[     退出键
0001 1100     28     1C     FS     ␜     ^\     文件分割符
0001 1101     29     1D     GS     ␝     ^]     群組分隔符
0001 1110     30     1E     RS     ␞     ^^     记录分隔符
0001 1111     31     1F     US     ␟     ^_     单元分隔符
0010 0000     32     20     (space)
0010 0001     33     21     !
0010 0010     34     22     "
0010 0011     35     23     #
0010 0100     36     24     $
0010 0101     37     25     %
0010 0110     38     26     &
0010 0111     39     27     '
0010 1000     40     28     (
0010 1001     41     29     )
0010 1010     42     2A     *
0010 1011     43     2B     +
0010 1100     44     2C     ,
0010 1101     45     2D     -
0010 1110     46     2E     .
0010 1111     47     2F     /
0011 0000     48     30     0
0011 0001     49     31     1
0011 0010     50     32     2
0011 0011     51     33     3
0011 0100     52     34     4
0011 0101     53     35     5
0011 0110     54     36     6
0011 0111     55     37     7
0011 1000     56     38     8
0011 1001     57     39     9
0011 1010     58     3A     :
0011 1011     59     3B     ;
0011 1100     60     3C     <
0011 1101     61     3D     =
0011 1110     62     3E     >
0011 1111     63     3F     ?
0100 0000     64     40     @
0100 0001     65     41     A
0100 0010     66     42     B
0100 0011     67     43     C
0100 0100     68     44     D
0100 0101     69     45     E
0100 0110     70     46     F
0100 0111     71     47     G
0100 1000     72     48     H
0100 1001     73     49     I
0100 1010     74     4A     J
0100 1011     75     4B     K
0100 1100     76     4C     L
0100 1101     77     4D     M
0100 1110     78     4E     N
0100 1111     79     4F     O
0101 0000     80     50     P
0101 0001     81     51     Q
0101 0010     82     52     R
0101 0011     83     53     S
0101 0100     84     54     T
0101 0101     85     55     U
0101 0110     86     56     V
0101 0111     87     57     W
0101 1000     88     58     X
0101 1001     89     59     Y
0101 1010     90     5A     Z
0101 1011     91     5B     [
0101 1100     92     5C     \
0101 1101     93     5D     ]
0101 1110     94     5E     ^
0101 1111     95     5F     _
0110 0000     96     60     `
0110 0001     97     61     a
0110 0010     98     62     b
0110 0011     99     63     c
0110 0100     100     64     d
0110 0101     101     65     e
0110 0110     102     66     f
0110 0111     103     67     g
0110 1000     104     68     h
0110 1001     105     69     i
0110 1010     106     6A     j
0110 1011     107     6B     k
0110 1100     108     6C     l
0110 1101     109     6D     m
0110 1110     110     6E     n
0110 1111     111     6F     o
0111 0000     112     70     p
0111 0001     113     71     q
0111 0010     114     72     r
0111 0011     115     73     s
0111 0100     116     74     t
0111 0101     117     75     u
0111 0110     118     76     v
0111 0111     119     77     w
0111 1000     120     78     x
0111 1001     121     79     y
0111 1010     122     7A     z
0111 1011     123     7B     {
0111 1100     124     7C     |
0111 1101     125     7D     }
0111 1110     126     7E     ~
0111 1111     127     7F     DEL     ␡     ^?     删除

原文链接: https://www.cnblogs.com/yinheyi/p/6286106.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    基本的输入输出函数介绍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/395424

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月4日 上午9:49
下一篇 2023年4月4日 上午9:50

相关推荐