C语言 基本输入输出函数

1 几组常见的输入输出函数

在stdio.h头文件中内置了几种输入输出函数,如下列出:

  • printf 与 scanf
  • getchar 与 putchar
  • gets 与 puts

相比之下 printf 与 scanf的功能最为强大,但操作稍显复杂,后两种则功能简单,但针对性较强。

2 printf函数

功能:按照规定格式输出指定数据

2.1.一般形式:如图

这里写图片描述

格式控制:由“%”后跟格式字符组成。将输出数据转换为指定格式输出,字符串原样输出,转义字符对输出形式进行控制。

2.2.格式说明

这里写图片描述

附加格式说明字符 说 明
- 输出的数字或字符以左对齐,右边填空格
0(数字) 输出的空位用0填充。
m(一个正整数) 输出数据的字段宽度。如果实际位数多于m,按实际位数输出;如果实际位数少于m,则补以空格或0。
.n(一个正整数) 对实数,表示输出n位小数;对字符串,表示截取的字符个数。
l(字母) 输出长整型整数

2.2.1常见格式输出

%d —— 以带符号的十进制形式输出整数
%o —— 以无符号的八进制形式输出整数
%x —— 以无符号的十六进制形式输出整数
%u —— 以无符号的十进制形式输出整数
%c —— 以字符形式输出单个字符
%s —— 输出字符串
%f —— 以小数点形式输出单、双精度实数
%e —— 以标准指数形式输出单、双精度实数
%g —— 选用输出宽度较小的格式输出实数
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2.3 %d格式符

格式: %[-][0][m][l]d

说明:

  • %d 按整型数据的实际长度输出。

  • %[0]md 以m指定的字段宽度输出,如果数据的位数小于m,则左端补以空格;若m前面有“0”,则左端补以0。

  • %-md 以m指定的字段宽度输出,左对齐。

  • %ld 输出长整型数据。

2.4 %c格式符

格式:%[m]c

说明:输出一个字符。输出数据可以是单个字符,或一个范围在0~255之间的整数。

例:

#include <stdio.h>
main( )
{   char x=‘a’;  int i=98;
    printf("%c,%d\n",x,x);
    printf("%c,%d\n",i,i);
}

// output
a,97
b,98
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2.5 %s格式符

格式:%[-][m][.n]s

说明:

  • %s 直接输出指定字符串。

  • %ms 输出字符串占m列,右对齐。m小于字符串长度时原样输出,大于字符串长度时不足补空格,下同。

  • %-ms 输出字符串占m列,左对齐。

  • %m.ns 输出字符串前n个字符,占m列,右对齐。

例:

#include<stdio.h> 

void main(){
    printf("%3s,%-6s,%-5.2s,%4.3s,%.3s,","hello", 
    "hello","hello","hello","hello");
}
输出结果:
hello,hello ,he   , hel,hel,
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2.6 %f格式符

格式: %[-][0][m][.n][l]f

说明:

  • %f 整数部分全部输出,小数部分输出6位(四舍五入)。

  • 0 右边补0满足小数位数,或左边补0满足m列

  • %m.nf 输出数据共占m列,小数占n位,右对齐。只有m时,当m大于字符串长度则需补足m列,当m小于字符串长度则与%f同

  • %-m.nf 输出数据共占m列,小数占n位,左对齐。

  • %lf 以双精度输出

例:

#include<stdio.h> 

void main(){

    float f=3.14159;
    printf("%f,%07.3f,%-7.3f,%10f,%.3f,",f,f,f,f,f);
}  

// output:
3.141590,003.142,3.142  ,  3.141590,3.142,
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2.7 %e格式符

格式:%[-][0][m][.n]e

说明:

  • %e:输出数据共占13位,其中整数部分为1位非零数字,小数点占1位,小数部分为6位,指数部分e占1位,指数符号占1位,指数为3位。若输出数据为负数,还应增加一位整数部分的符号位。

  • %m.ne 输出占m列,小数位为n项(四舍五入)。m小于输出宽度时原样输出,大于输出宽度时补足空位

  • –设置左对齐

如下图 
这里写图片描述

例:

#include<stdio.h> 

void main(){
    printf("\n,%10.1e",31.5);
}
// output
,  3.2e+001
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.8 %o、%x和%u格式符

格式: %[-][0][m][l]o(x或u)

说明: 
将内存单元中的二进制数(包括符号位)直接转换成八进制数、十六进制或十进制数输出。

  • %o 输出无符号八进制
  • %x 输出无符号十六进制
  • %u 输出无符号十进制

例:

#include<stdio.h> 

void main(){
    int i=-1;
    printf("\n%d,%o,%x,%u",i,i,i,i);
}

// output
-1,37777777777,ffffffff,4294967295
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

例:

#include<stdio.h> 

void main(){
    unsigned char ch1 = 255; // 1111 1111  ,1字节
    char ch2 = -128;
    // %hh 限定了字符为8位一个字节 
    // %hhd 有符号十进制字符型 %hhu 无符号十进制字符型
    printf("\n\n%hhd,%hhu,%hho,%hhx",ch2,ch1,ch1,ch1);//128,255,377,ff
    // %h 限定了16位2个字节     
    unsigned short sh1 = 65535; // 1111 1111 1111 1111 ,2字节
    short sh2 = -32767; 
    printf("\n%hu,%hd,%ho,%hx",sh2,sh1,sh1,sh1);  // 32769,-1,177777,ffff

    // %l 限定了32位4个字节 
    unsigned long ulong = 4294967295; //1111 1111 1111 1111 1111 1111 1111 1111  ,4字节
    long slong = -2147483647;
    printf("\n%ld,%lu,%lo,%lx",slong,ulong,ulong,ulong); // -2147483647,4294967295,37777777777,ffffffff

    // %ll 限定了64位8个字节 
    unsigned long long ull= 4294967295;
    long long ll = -2147483647;
    printf("\n%lld,%llu,%llo,%llx",ll,ull,ull,ull);  // -2147483647,4294967295,37777777777,ffffffff


    // %e指数输出
    long double lb = 198888888888;
    printf("\n%Lf,%Le,%Lo,%Lx,%Lg",lb,lb,lb,lb,lb);  // 0.000000,5.180393e-317,47776740,9ffdd0,5.18037e-317
    printf("\n%La,%LA",lb,lb); // 输出十六进制的指数形式  0x0.000000p-1022,0X0.000000P-1022
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

2.9 %g格式符

根据数值的大小,自动选择用f格式或e格式输出实数。输出时选择占宽度较小的一种,且不输出无意义的零。

例:

#include<stdio.h> 

void main(){
    float f=3.14159;
    printf("\n%e,%f,%lf,%g",f,f,f,f);
} 
// output
3.141590e+000,3.141590,3.141590,3.14159
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.10 使用printf的注意事项

  • 不同类型的数据应使用相应类型的格式字符说明其输出形式,以保证显示结果符合预期。

  • 格式字符中,除了X、E、G外,其他均用小写字母,如“%d”不能写成“%D”。

  • 如需输出双引号,应在“格式控制”中表示为转义字符的形式并用单引号引起来,即“\””。

  • 如需输出字符“%”,在“格式控制”中用连续两个“%”即可。 
    如:printf(“%d%%”,10);

  • 当“格式控制”中格式符个数少于输出表中的输出项时,多余的输出项不予输出。

  • 当“格式符”多于输出项时,多出的格式符输出结果为不定值。

3 scanf函数

与printf函数一样,scanf函数也是遵守格式化(format)原则,所谓格式化,是该函数预先给程序员定义了一批输入格式,程序员可以选择其中的某些格式,遵守这些格式,scanf函数就可以按照指定的格式来接收键盘的输入数据了。

scanf函数只能在控制台程序中使用,有窗口的界面程序无法通过scanf接收按键。当控制台中出现闪烁的光标时,表示程序在等待用户输入数据。在控制台程序中,一般以回车键代表数据输入完毕,下达命令,指示程序开始工作。scanf函数可以接收多个任意类型的数据,但需严格遵守format格式,否则会出错。

3.1 一般形式:如图

这里写图片描述

功能:要求用户从键盘上输入指定格式的数据。 
说明:如果数据不止一个,应在数据之间用一个或多个空格间隔,也可以用回车键或跳格键tab间隔。

3.2 scanf格式控制

格式控制

格式符 说明
d 用于输入十进制整数
o 用于输入八进制形整数
x 用于输入十六进制整数
c 用于输入一个字符
s 用于输入字符串,并将字符串送到一个字符数组中。输入时以非空白字符开始, 第一个空白字符结束。字符串以串结束标志“\0”作为其最后一个字符。
f 用于输入实数。输入时用小数点形式或指数形式均可。(输入双精度必须用%lf,否则不能正常输入)
e 与f作用相同

附加格式

格式字符 说明
* 表示本输入项在输入后不赋给相应的变量。(不存储)
l(字母) 用于输入长整型和双精度实型数据
m(一个正整数) 用于输入长整型和双精度实型数据

3.3 scanf函数的格式字符串的组成

  • 格式符 
    和printf函数类似,scanf函数的格式字符串以%开始,以一个格式字符结束,中间可以插入附加字符。格式符告诉了scanf函数该读取什么样的数据。

  • 空白符 
    空白符可以是空格(space,用空格键输入)、制表符(tab,用Tab键输入)和新行符(newline,用回车键输入),或者它们的组合

  • 非空白符 
    除去格式说明符合空白符之外,就是非空白符。非空白符在用户输入的时候,也必须一并输入。非空白符使scanf() 在缓冲区中读一个匹配的字符并将这个字符忽略。例如,”%d,%d”使scanf()先读入一个整数,接着必须要读入一个逗号,读入到逗号后,表示格式匹配,将读入的逗号丢弃,而不像读入的整数存储到某个内存空间。读入逗号后,接着读入另一个整数。如发现不能匹配格式字符串,比如没有读到逗号,scanf()返回,读入失败。

3.4 使用scanf注意事项

  • 1)注意变量表列中,应该是变量的地址。变量的地址通过求地址符&得到。所以在写代码时千万不要遗漏&符号。

  • 2)如果格式字符串中有非空白字符,也就是除了格式控制字符和空白字符之外的字符,则用户在输入的时候一定也要输入这些字符。否则将出现不匹配格式控制字符串的情况。为了使用户正确输入,编程时一定要考虑到用户是否清楚如何输入,最好在需要用户输入前提示如何输入的格式。

  • 3)在用%c格式符时,空格字符和转义字符都被当作有效字符输入

  • 4)以回车作为下达开始解析命令。整个输入以回车结束。

    如果输入的数据满足了scanf对需要,则输入结束,如果回车后数据不够,则回车只当作一个空白符。

  • 5)scanf解析数据,下列情况认为解析出来一个数据:

    读入非字符型数据时,遇到空白字符。有宽度指示时,读入到相应的宽度。如%4d,则只解析4个数字即认为读入这个整数完毕。

  • 6) 读取双精度double浮点数时,最好使用%lf输入,使用%f可能会导致精度损失甚至读取失败。

3.5 scanf使用示例

// 1)可以指定输入的数据所占据的字符个数,scanf函数自动按照指示截取所需长度的数据。如:
    int i,j;
    scanf("%3d%3d",&i,&j);  // 输入:1234567↙
    printf("%d,%d",i,j);  // 输出  123,456

// 2)%后面的*格式符,用来表示在解析时,将读入的数据忽略不赋给任何变量。如:
    int i,j;
    scanf("%d %*d %d",&i,&j); // 输入: 123 456 789 
    printf("%d,%d",i,j);    // 输出: 123,789
// 3)输入数据时不能指定精度。如:
    float f;
    scanf("%7.2f",&f); // 输入 123.456 
    printf("%f23",f); // 输出 0.00000023 
// 4) 输入双精度数使用%lf
    // 输入双精度浮点数时,务必用%lf,如下错误
    double db;
    scanf("%f",&db);  //输入: 123.456
    printf("%f",db); // 输出 : 0.000000 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

4 字符输入输出(getchar/putchar)

有些时候,仅仅为了在显示器屏幕上打印或从控制台获取一个字符,此时使用功能强大的printf与scanf函数,则显得过于繁琐,C提供了一个库函数putchar/getchar来完成这个简单的任务。

4.1 putchar

putchar 函数是字符输出函数, 其功能是在显示器上打印单个字符。putchar函数是一个标准的C语言库函数,它的函数原型在头文件“stdio.h”中。

1 putchar函数的一般格式:

putchar(字符数据);
  • 1
  • 2

其中的putchar是函数名称。

2 可以输出的字符类型:

  • 1)字符数据可以是一个字符型变量,如:char c_var= ‘a’; putchar(c_var);

  • 2)字符数据也可以是一个字符常量,如putchar(‘a’);输出结果:a

  • 3)字符数据还可以是一个整数。整数可以是十进制整数,如:putchar(97);输出结果:a

  • 4)字符数据还可以是一个表达式,只要结果是255以内的整数即可。如: 
    putchar(‘a’+25);输出结果:z

  • 5)字符数据可以是转义字符。如: 
    putchar(‘\n’);结果输出一个换行。putchar(‘\007’); 输出一个提示音

4.2 getchar

这个函数和前面介绍的putchar函数刚好相反。

getchar 函数是得到字符输入函数,其功能是得到用户输入的一个字符。getchar函数是一个标准的C语言库函数,它的函数原型在头文件“stdio.h”中。

getchar函数的一般格式是:

char ch;
ch=getchar();
  • 1
  • 2
  • 3

用户输入的字符就赋给了ch变量。如:

char ch;
ch=getchar();  // 获取输入的字符
printf("%c",ch);
  • 1
  • 2
  • 3

5 字符串输入输出函数 (gets与puts)

5.1 puts

puts函数功能非常单一,在显示器屏幕上输出一个字符串,并换行。

一般形式:

puts(字符串);
  • 1
  • 2

如:

puts("你好啊~");
输出结果:
你好啊~
  • 1
  • 2
  • 3

5.2 gets

gets从标准输入设备读字符串函数。可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。此函数在stdio.h头文件中定义的。

功能

    从stdio流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为‘\0’空字符,并由此来结束字符串。 
  • 1
  • 2

返回值

    读入成功,返回与参数buffer相同的指针;读入过程中遇到EOF(End-of-File)或发生错误,返回NULL指针。所以在遇到返回值为NULL的情况,要用ferror或feof函数检查是发生错误还是遇到EOF。 
  • 1
  • 2

示例

    #include <stdio.h>   
    void main(void)
    {
       char buf[20];  //不要char*p,然后gets(p),这是错误的,因为p没有指向有效的内存,它可能指向任何非法地址 ,造成非法访问异常                 
       gets(buf);
       printf("%s\n", buf);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

与gets/puts类似的还有fgets与fputs,它们一般用于对文件的操作。关于fgets与fputs的用法案例可以参考C语言学习笔记之文件的分割与合并


后记: 此篇为总结篇,回顾之前的基础知识,留个印记。欢迎交流学习~

致谢: C语言 基本输入输出函数



猜你喜欢

转载自blog.csdn.net/qq_38880380/article/details/80537438