关于程序员:玩转C语言深入理解输入输出函数的奥秘

54次阅读

共计 5384 个字符,预计需要花费 14 分钟才能阅读完成。

✨✨ 欢送大家来到贝蒂大讲堂✨✨

🎈🎈养成好习惯,先赞后看哦~🎈🎈

所属专栏:C 语言学习
贝蒂的主页:Betty‘s blog

1. 单字符输入函数

在 C 语言中有一个函数 putchar 专门负责输入单个字符,其语法如下:

  1. 头文件:#include<stdio.h>
  2. 申明:int putchar(int char)

    • char — 这是要被写入的字符。该字符以其对应的 int 值进行传递。
  3. 作用:把参数 char 指定的字符(一个无符号字符)写入到规范输入 stdout 中,也就是输入单个字符。
  4. 返回值:该函数以无符号 char 强制转换为 int 的模式返回写入的字符,如果产生谬误则返回 EOF。

以下是对 putchar 的具体应用示例:

#include<stdio.h>
int main()
{putchar('A');// 输入字符 A    
    putchar('1');// 输入字符 1
    putchar('\106');// 输入转义字符 F
    return 0;
}

输入后果:

2. 多字符输入函数

既然有单字符输入函数,那就天然有多字符输入函数——puts,其语法如下:

  1. 头文件:#include<stdio.h>
  2. 申明:int puts(const char *str)

    • str — 这是要被写入的 C 字符串。
  3. 作用:把一个字符串写入到规范输入 stdout,直到空字符,但不包含空字符。换行符会被追加到输入中。
  4. 返回值:如果胜利,该函数返回一个非负值为字符串长度(包含开端的 \0),如果产生谬误则返回 EOF。

以下是对 puts 的具体应用示例:

int main()
{puts("hello world\n");
    puts("贝蒂来啦 \n");
    return 0;
}

输入后果:

3. 格式化输入函数

3.1 语法

介绍完单字符与多字符输入函数,上面咱们将介绍格式化输入函数——printf,其语法如下:

  1. 头文件:#include<stdio.h>
  2. 申明:int printf(const char *format, …)

    • format — 这是字符串,蕴含了要被写入到规范输入 stdout 的文本。它能够蕴含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需要进行格式化。
  3. 作用:将参数⽂本输入到屏幕
  4. 返回值:如果胜利,则返回写入的字符总数,否则返回一个正数。

3.2 占位符

printf() 能够在输入⽂本中指定占位符。所谓“占位符”,就是这个地位能够⽤其余值代⼊。下表是常见的占位符:

占位符 含意
%d 以十进制模式输入整数
%u 以十进制模式输入无符号整数
%x 以十六进制模式输入整数(小写字母)
%X 以十六进制模式输入整数(大写字母)
%o 以八进制模式输入整数
%f 以浮点数模式输入实数
%e 以指数模式输入实数
%g 主动抉择 %f 或 %e 输入实数
%c 输入单个字符
%s 输入字符串
%p 输入指针的地址
%n 输入曾经输入的字符数
%% 输入百分号自身

以下是对 printf 的具体应用示例:

int main()
{printf("%d\n", 5);// 打印整型
    printf("%f\n", 5.1);// 打印浮点型
    printf("%c\n", 'a');// 打印字符
    printf("%s\n", "betty");// 打印字符串
    printf("betty");// 也能够这样打印字符串
    return 0;
}

输入后果:

  • printf() 参数与占位符是⼀⼀对应关系 ,如果有 n 个占位符,printf() 的参数就应该有 n +1 个( 双引号外部也算一个)。如果参数个数少于对应的占位符,printf() 可能会输入内存中的任意值。

3.3 限定格局

(1) 限定宽度

printf() 容许限定占位符的最⼩宽度。以下是具体的实例:

int main()
{printf("%4d\n", 123);
    printf("%-4d\n", 123);
    printf("%12f\n", 123.45);
    return 0;
}

  • 上⾯⽰例中,%4d 表⽰这个占位符的 宽度至多为 4 位。如果不满 4 位,对应的值的前⾯会 增加空格 。输入的值 默认是右对⻬,即输入内容前⾯会有空格;如果心愿改成左对⻬,在输入内容后⾯增加空格,能够在占位符的 % 的后⾯插⼊⼀个 – 号。
  • 对于⼩数,这个限定符会限度所有数字的 最⼩显⽰宽度 。上⾯⽰例中,%12f 表⽰输入的浮点数起码要占据 12 位。因为 ⼩数的默认显⽰精度是⼩数点后 6 位,所以 123.45 输入后果的头部会增加 2 个空格。

(2) 总是显示正负号

默认状况下,printf() 不对负数显示 + 号,只对正数显示 – 号。如果想让负数也输入 + 号,能够在占位符的 % 后⾯加⼀个 +。

int main()
{printf("%+d\n", 13);
    printf("%+d\n", -13);
    return 0;
}

(3) 限度小数位数

输入⼩数时,有时心愿 限定⼩数的位数 。举例来说,心愿⼩数点后⾯只 保留两位,占位符能够写成 %.2f

#include <stdio.h>
int main()
{printf("Number is %.2f\n", 0.5);// 输入 0.50
    return 0;
}
  • 这种写法也是能够与限定宽度联合应用的

(4) 限定字符串的输入

%s 占位符⽤来输入字符串,默认是全副输入。如果只想输入结尾的局部,能够⽤ %.[m]s 指定输入的⻓度,其中 [m] 代表⼀个数字,表⽰所要输入的⻓度。

#include <stdio.h>
int main()
{printf("%.5s", "hello world");
    return 0;
}

输入后果:

(5) 限定值输出

最⼩宽度和⼩数位数这两个限定值,都能够⽤ * 代替,通过 printf() 的参数传⼊。

#include <stdio.h>
int main()
{printf("%*.*f\n", 6, 2, 0.5);
    return 0;
}// 等同于 printf("%6.2f\n", 0.5);

3.4 printf 的返回值

咱们在后面介绍 printf 时候就曾经理解过其返回值:如果胜利,则返回写入的字符总数,否则返回一个正数。

上面就让咱们通过下列两道题来加深了解:

(1) 题目一

int main()
{
    int a = 43;
    printf("%d\n", printf("%d", printf("%d", a)));// 输入什么??return 0;
}
  1. 首先必定会执行最外面的 printf(“%d”,43),在屏幕上打印出 43。
  2. 而后执行 printf(“%d”, printf(“%d”, 43)),相当于打印第一步 printf 的返回值,‘4’,‘3’有两个字符,所以返回值是 2。
  3. 最初同理执行 printf(“%d”, printf(“%d”, printf(“%d”, 43))),即打印第二步的‘2’返回值,一个字符,返回值为 1。
  4. 所以屏幕上最初打印的就是4321

(2) 题目二

int main()
{printf("%d\n",printf("%d\n",printf("hello!\n"))); // 输入??return 0;
}https://s11.ax1x.com/2024/02/20/pFYxXCT.png
  1. 首先必定会打印出 hello!而后换行。
  2. 而后打印 printf(“%d\n”,printf(“hello!\n”)),即第一步的返回值,须要留神是‘\n’是一个字符,所以返回值是 7,换行。
  3. 最初打印 printf(“%d\n”,printf(“%d\n”,printf(“hello!\n”))),即第二步的返回值,格式化字符串的‘\n’也会算做一个字符,一共两个字符,所以最初打印出 2。

4. 单字符输出函数

单字符输出函数——getchar,顾名思义就是读取一个字符,其用法如下:

  1. 头文件:#include<stdio.h>
  2. 申明:int getchar()
  3. 作用:从规范输出 stdin 获取一个字符(一个无符号字符)
  4. 返回值:该函数以无符号 char 强制转换为 int 的模式返回读取的字符,如果达到文件开端或产生读谬误,则返回 EOF。

上面的实例演示了 getchar() 函数的用法:

#include <stdio.h>

int main()
{
    char c;
    printf("请输出字符:");
    c = getchar();
    printf("输出的字符:");
    putchar(c);
    return 0 ;
}

输入后果:

5. 多字符输出函数

多字符输出函数——gets,顾名思义就是输出一个字符,其用法如下:

  1. 头文件:#include<stdio.h>
  2. 申明:char gets(char str)

    • str — 这是指向一个字符数组的指针,该数组存储了 C 字符串。
  3. 作用:从规范输出 stdin 读取一行,并把它存储在 str 所指向的字符串中。
  4. 返回值:如果胜利,该函数返回 str。如果产生谬误或者达到文件开端时还未读取任何字符,则返回 NULL。

上面的实例演示了 gets() 函数的用法:

#include <stdio.h>
int main()
{char str[20] = {0};
    printf("请输出一个字符串:");
    gets(str);
    printf("您输出的字符串是:%s", str);
    return(0);
}

输入后果:

6. 格式化输出函数

6.1 语法

下列是格式化输出函数——scanf的用法:

  1. 头文件:#include<stdio.h>
  2. 申明:int scanf(const char *format, …)

    • format — 这是 C 字符串,蕴含了以下各项中的一个或多个:空格字符、非空格字符和 format 说明符。
  3. 作用:从规范输出 stdin 读取格式化输出
  4. 返回值:如果胜利,该函数返回胜利匹配和赋值的个数。如果达到文件开端或产生读谬误,则返回 EOF。

上面的实例演示了 scanf() 函数的用法:

#include<stdio.h>
int main()
{
    int a, b, c;
    printf("请输出三个数字:");
    scanf("%d%d%d", &a, &b, &c);
    printf("输入后果是:%d,%d,%d\n", a, b, c);
    return 0;
}
  • &a、&b、&c 中的 & 是地址运算符,别离取得这三个变量的内存地址。
  • %d%d%d 是按十进值格局输出三个数值。输出时,在两个数据之间能够用一个或多个 空格、tab 键、回车键 分隔。

输入后果:

  • 并且输出数据也要与格式化内数据保持一致。什么意思呢? 咱们以上面这段代码举例说明:
#include<stdio.h>
int main()
{
    int a, b;
    scanf("%d,d", &a, &b);
    // 输出 a,b?
    // 输出 a b?
    printf("输入后果是:%d,%d\n", a, b,);
    return 0;
}
  • 上诉代码只能输出 a,b,而不能输出 a b 因为要与格式化内容相匹配。

6.2 scanf 与 gets 之间的区别

scanf 在解决占位符时候,如果占位符不是 %c,会疏忽起始的 空格(非起始的空格会进行),换行符,制表符。而 gets 能够将输出流的数据 全副读取。比如说上面这段代码:

#include<stdio.h>
// 如果输出 hello betty
// 别离输入什么
int main()
{char arr1[20];// 寄存字符串
    gets(arr1);
    char arr2[20];// 寄存字符串
    scanf("%s", arr2);
    printf("arr1 输入:%s\n",arr1);
    printf("arr2 输入:%s\n", arr2);
    return 0;
}

  • 第一次输出 gets 全副读取,第二次输出 printf 遇见空格就进行读取。

6.3 缓存区

scanf() 解决用户输⼊的原理是,用户的输⼊先放⼊一个区域,等到按下回⻋键后,依照占位符对缓存进⾏解读。而这个区域就是咱们的 缓存区

注:规范输出⼀般指的就是键盘,规范输入⼀般指的就是屏幕

晓得了缓冲区之后,让咱们来剖析一段代码:

int main()
{char password[20];
    printf("请输出你的明码:");
        scanf("%s", password);
    int ret = getchar();
    printf("请再次确认你的明码(Y/N):");
    if (ret == 'Y')
    {printf("明码正确 \n");
    }
    else
    {printf("明码谬误 \n");
    }
    return 0;
}

输入后果:

为什么会呈现这样的后果呢?这时就要使用缓冲区的常识,在咱们输出 abc 回车 (\n) 时,缓冲区中的数据为 abc\n,而 scanf 只会读取 abc,\n 会被始终留在缓冲区。所以在 getchar 再次读取时会主动读取 \n,输入明码谬误。

解决这个问题也很简略,咱们只须要再加一个 getchar 提前把 \n 读取就行了。

int main()
{char password[20];
    printf("请输出你的明码:");
    scanf("%s", password);
    printf("请再次确认你的明码(Y/N):");
    getchar();// 清空缓冲区
    int ret = getchar();
    if (ret == 'Y')
    {printf("明码正确 \n");
    }
    else
    {printf("明码谬误 \n");

    }
    return 0;
}

6.4 scanf 的返回值

如果胜利,该函数返回 胜利匹配和赋值的个数 。如果达到文件开端或产生读谬误,则返回 EOF。这一点经常用于多组数据输出,比如说 多组数据求和,能够写成如下模式:

int main()
{
    int a, b;
    while (scanf("%d%d") == 2)
    {
        int sum = a + b;
        printf("%d", sum);
    }
    return 0;
}
  • 在 VS 环境下能够按 3 次 ctrl+z 强制完结。

正文完
 0