C语言学习 - 输入输出

输入输出的概念
  • 标准的输出指屏幕终端,标准的输入指键盘,其它的输入输出可以是文件、打印机、扫描仪等设备。
  • 在C语言中,所有的数据输入输出都是由库函数完成的,在使用标准输入输出函数库时要用到stdio.h文件,因此源文件开头要使用预处理指令#include将其包括进来:
    格式: #include <stdio.h>
printf函数
  • printf函数称为格式输出函数,其功能是按用户指定的格式把指定的数据输出。
  • printf函数是一个标准函数库,其函数原型声明在头文件stdio.h中。
  • printf函数语法:printf("格式控制字符串", 输出列表);
    I. 格式控制字符串用于指定输出格式,可由格式字符串和非格式字符串两种组成。
    II. 格式控制字符串是以%开头的字符串,在%后面跟各种格式字符,以说明输出数据的类型、形式、长度、小数位等,即:%[标志][输出最小宽度][.精度][长度]类型。
    【标志】:
    -:结果左对齐,右边填空格。
    +:输出符号(正号或负号)。
    空格:输出值为正时冠以空格,为负时冠以负号。
    #:对c、s、d、u类无影响;对o类,在输出时加前缀o;对x类,在输出时加前缀0x;对e、g、f类,当结果有小数时才给出小数点。
    【输出最小宽度】:
    用十进制整数来表示。
    若实际位数多于定义的宽度,则按实际位数输出,若实际位数小于定义的宽度,则补以空格或0,如:%05d(宽度5位,以0补全)、%5d(宽度5位,以空格补全)。
    【.精度】
    精度格式以.开头,后跟十进制整数。
    此项意义为:如果输出数字,则表示小数的位数;如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分(四舍五入)。
    【长度】:
    格式符为h、l、L三种,h表示按短整型输出,l表示按长整型输出,L表示按长双精度型输出。
    【类型】:
    d:以十进制形式输出带符号整数(正数不输出符号)。
    o:以八进制形式输出无符号整数(不输出前缀0)。
    x,X:以十六进制形式输出无符号整数(不输出前缀Ox)。
    u:以十进制形式输出无符号整数。
    f:以小数形式输出单、双精度实数。
    e,E:以指数形式输出单、双精度实数。
    g,G:在%f和%e之间自动选择(选择较短的输出宽度)输出单、双精度实数。
    c:输出单个字符。
    s:输出字符串。
    III. 非格式字符串在输出时按照原样输出。
    IV. 输出列表中给出了各个输出项,格式控制字符串和各输出项在数量和类型上应该一一对应。
    *的用法:
#include <stdio.h>

int main(void)
{
    int a, b;
    float c = 555.555;

    scanf("%d%d", &a, &b);
 
    // 第一个*指变量a,表示输出最小宽度;第二个*指变量b,表示精度;0表示不满输出最小宽度时,以0补全
    printf("c:%0*.*f\n", a, b, c);

    return 0;
}

以上程序运行示例:

[root@izbp1ezvecfb1wm1s1l8ggz c_code]# gcc -Wall -O2 -o printf_test printf_test.c   
[root@izbp1ezvecfb1wm1s1l8ggz c_code]# ./printf_test   
9 4
c:0555.5550
scanf函数
  • scanf函数称为格式输入函数,其功能是按用户指定的格式从键盘上把数据输入到指定的变量之中。
  • scanf函数是一个标准函数库,其函数原型声明在头文件stdio.h中。
  • scanf函数语法:printf("格式控制字符串", 地址列表);
    I. 格式控制字符串用于指定输入格式。
    II. 格式控制字符串是以%开头的字符串,在%后面跟各种格式字符,以说明输入数据的宽度、长度、类型,即:%[输入数据宽度]长度]类型。
    【输入数据宽度】:
    用十进制整数来表示。
    若实际输入宽度超过指定宽度,则多余部分被截去。
    【长度】:
    格式符为h、l、L三种,h表示按短整型输入,l表示按长整型输入,L表示按长双精度型输入。
    【类型】:
    d:输入十进制整数。
    o:输入八进制整数。
    x,X:输入十六进制整数。
    u:输入无符号十进制整数。
    f,e,E,g,G:输入浮点数(以小数形式或者指数形式)。
    c:输入单个字符。
    s:输入字符串。
    III. 地址列表中给出各变量的地址,地址是由地址运算符&后跟变量名组成(数组不需要地址运算符&,数组名即是地址)。
    普通变量形式:
#include <stdio.h>

int main(void)
{
    int a, b;
    printf("please input height and width:");
    scanf("%d%d", &a, &b);
    printf("a:%d \n", a);
    printf("b:%d \n", b);

    return 0;
}

数组形式:
注意:使用scanf函数无法读取带空格的输入字符串,若需读取带空格的输入字符串,可以使用fgets函数。

#include <stdio.h>

int main(void)
{
    char a[20];
    printf("please input a word:");
    scanf("%s", a);
    printf("a:%s \n", a);

    return 0;
}

一次输入多个值(多个值之间使用空格分隔):

#include <stdio.h>

int main(void)
{
    char a, b;

    printf("please input two character:");
    // 两个%c之间需使用空格隔开,或者第二个字符将读取两个输入值之间的空格符
    scanf("%c %c", &a, &b);

    printf("a:%c\n", a);
    printf("b:%c\n", b);

    return 0;
}

输入多次内容:

#include <stdio.h>

int main(void)
{
    int a;
    char b;

    printf("please input a number:");
    scanf("%d", &a);
    // 因第一次输入完成后会按回车,因此这里需要使用getchar函数读取回车\n,否则将把回车\n直接赋给变量b
    getchar();
    printf("please input a character:");
    scanf("%c", &b);

    printf("a:%d\n", a);
    printf("b:%c\n", b);

    return 0;
}

*的用法:

#include <stdio.h>

int main(void)
{
    int a;

    // 这里的*表示跳过,因此这里将跳过前2个的输入数据,将第三个输入数据复制给变量c
    scanf("%*d %*d %d", &a);

    printf("a:%d\n", a);

    return 0;
}

以上程序运行示例:

[root@izbp1ezvecfb1wm1s1l8ggz c_code]# gcc -Wall -O2 -o printf_test printf_test.c   
[root@izbp1ezvecfb1wm1s1l8ggz c_code]# ./scanf_test                          
1
2
3
a:3
[root@izbp1ezvecfb1wm1s1l8ggz c_code]# ./printf_test 
1 2 3
a:3
fgets函数
  • fgets函数功能是从指定的流stream读取一行,并把它存储在指定的字符串内。当读取(n-1)个字符,或者读取到换行符,或者到达文件末尾时,它会停止,具体视情况而定。
  • fgets函数是一个标准函数库,其函数原型声明在头文件stdio.h中。
  • fgets函数语法:fgets("字符数组地址", "最多字符数", "从中读取字符的流");
    【字符数组地址】:
    数组名即是字符数组地址
    【最多字符数】:
    用十进制整数来表示。
    通常使用字符数组的长度。
    【从中读取字符的流】
    可以是指向FILE对象的指针,或者标准输入stdin。
#include <stdio.h>

int main(void)
{
    char a[20];
    printf("please input a sentence:");
    // stdin指标准输入,一般是从输入设备如键盘的缓冲区输入
    fgets(a, sizeof(a)-1, stdin);
    printf("a:%s \n", a);

    return 0;
}

以上程序运行示例:

[root@izbp1ezvecfb1wm1s1l8ggz c_code]# gcc -Wall -O2 -o printf_test printf_test.c   
[root@izbp1ezvecfb1wm1s1l8ggz c_code]# ./fgets_test   
please input a sentence:This is a dog.
a:This is a dog.
 

注意:因为输入完成后按回车表示结束,因此最后打印了一行空行。

getchar函数
  • getchar函数是键盘输入函数,从键盘上输入一个字符,通常再将其赋予一个字符变量。
  • getchar函数是一个标准函数库,其函数原型声明在头文件stdio.h中。
  • getchar函数只能接受单个字符,若输入的是数字,也按字符处理;输入多于一个字符时,只接受第一个字符。
  • getchar函数使用:char 字符变量 = getchar()
#include <stdio.h>

int main(void)
{
    char a = getchar();

    printf("a:%c\n", a);

    return 0;
}
putchar函数
  • putchar函数是字符输出函数,在屏幕终端上输出单个字符,并且返回输出的字符。
  • putchar函数是一个标准函数库,其函数原型声明在头文件stdio.h中。
  • getchar函数使用:
#include <stdio.h>

int main(void)
{
    char a;
    
    printf("please input a character\n");
    a = getchar();

    char b = putchar(a);
    // 输出换行符时必须使用单引号包括
    putchar('\n');

    printf("b:%c\n", b);

    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容

  • C/C++输入输出流总结 前两天写C++实习作业,突然发现I/O是那么的陌生,打了好长时间的文件都没有打开,今天终...
    LuckTime阅读 1,724评论 0 6
  • 一、输入和输出流 C 语言的标准输入输出函数都是独立于设备的,不需要考虑如何在特定设备上传输数据;C 语言的库函数...
    seraphzxz阅读 1,118评论 0 51
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,340评论 0 2
  • 错误报告 perror函数简化向用户报告特定错误的过程。它的原型定义于studio.h,如下: 如果message...
    d9fc24a0c9a9阅读 1,562评论 0 0
  • 学习C语言程序设计都会用到高等数学知识和计算机基础理论知识。 使用可变参数应该有以下步骤: 1)首先在函数里定义一...
    皓小天阅读 5,775评论 0 2