【C语言】格式化输入输出函数讲解

简介: scanf、fscanf、sscanf / printf、fprintf、sprintf 这些函数长得都挺像的,它们分别都是干什么的呢?本篇博客将对这些格式化输入输出函数进行一个讲解。本篇为文件操作章节的延申,新手建议学过文件操作后观看

前言


scanf、fscanf、sscanf / printf、fprintf、sprintf 这些函数长得都挺像的,它们分别都是干什么的呢?本篇博客将对这些格式化输入输出函数进行一个讲解。本篇为文件操作章节的延申,新手建议学过文件操作后观看

一、printf / fprintf / sprintf


0x00 printf 函数

50692a56c89aacaf01762bd1151af596_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw5qON6KKL5a2Q,size_20,color_FFFFFF,t_70,g_se,x_16.png

📂 头文件:#include <stdio.h>


📚 针对标准输出的格式化输出语句 - stdout


🔍 MSDN介绍:printf - C++ Reference

be623bf42fc1aacbad7ad1bbd9252cdc_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw5qON6KKL5a2Q,size_20,color_FFFFFF,t_70,g_se,x_16.png

💬 代码演示:printf 的用法


#include <stdio.h>
int main(void) {
    printf("Hello,World!\n");
    int a = 100;
    printf("a=%d", a);
    return 0;
}

🚩 运行结果如下:

fc4be4ca54541437463cc4d4969d39b3_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw5qON6KKL5a2Q,size_20,color_FFFFFF,t_70,g_se,x_16.png


0x01 fprintf 函数

62b55ab0a6d13366e9e602decae58ea3_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw5qON6KKL5a2Q,size_20,color_FFFFFF,t_70,g_se,x_16.png

📂 头文件:#include <stdio.h>


📚 针对所有输出流的格式化输出语句 - stdout / 文件


🔍 MSDN介绍:fprintf - C++ Reference

3ee74469ef4adb9cc32a06e2534bf846_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw5qON6KKL5a2Q,size_20,color_FFFFFF,t_70,g_se,x_16.png


💬 代码演示:随便创建一个文件,在文件中写入一段话


#include <stdio.h>
char data[] = "Hey, nice to meet you~";
int main(void) {
    FILE* pf = fopen("test1.txt", "w");
    if (pf == NULL) {
        perror("fopen");
        return 1;
    }
    // 使用fprintf写文件
    fprintf(pf, "%s", data);
    fclose(pf);
    pf = NULL;
    return 0;
}

🚩 (代码成功运行)

5eb3ca70e6910153a0420bebd970dab2_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw5qON6KKL5a2Q,size_20,color_FFFFFF,t_70,g_se,x_16.png


0x02 sprintf 函数

efbb5342c7019040362fd0e69deead32_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw5qON6KKL5a2Q,size_20,color_FFFFFF,t_70,g_se,x_16.png


📂 头文件:#include <stdio.h>


📚 作用:把一个格式化的数据转换成字符串。


🔍 MSDN介绍:sprintf - C++ Reference

c9dea2d5a639589476e26ee6254282b3_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw5qON6KKL5a2Q,size_20,color_FFFFFF,t_70,g_se,x_16.png



💬 代码演示:sprintf 的用法


#include <stdio.h>
struct S {
  char arr[10];
  int age;
  float f;
};
int main(void) {
  struct S s = { "hello", 20, 3.14f };
  char buffer[100] = { 0 }; // 用于存放
  sprintf(buffer, "%s %d %f", s.arr, s.age, s.f); // 把这些信息放到buffer中了
  printf("%s\n", buffer); // 将buffer打印出来
  return 0;
}


🚩 运行结果如下:

5c13d100ae9b13f46eff0230788ccd33_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw5qON6KKL5a2Q,size_20,color_FFFFFF,t_70,g_se,x_16.png



二、scanf / fscanf / sscanf


0x00 scanf 函数

421d0012ac9860d9f94d0fc4606b583b_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw5qON6KKL5a2Q,size_20,color_FFFFFF,t_70,g_se,x_16.png


📂 头文件:#include <stdio.h>


📚 针对标准输入的格式化的输入语句 - stdin


🔍 MSDN介绍:scanf - C++ Reference

7c9fc6d289a55f5bfd9e14f00a4f7888_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw5qON6KKL5a2Q,size_20,color_FFFFFF,t_70,g_se,x_16.png


💬 代码演示:scanf 的用法

#include <stdio.h>
int main(void) {
    int a = 0;
    int b = 0;
    scanf("%d %d", &a, &b);
    printf("a=%d, b=%d\n", a, b);
    return 0;
}

🚩 输入10 20,运行结果如下:

2213ebd371860470712dda160254c978_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw5qON6KKL5a2Q,size_20,color_FFFFFF,t_70,g_se,x_16.png


0x01 fscanf 函数

a1b49c6b8ec66533657bf53efac5d16d_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw5qON6KKL5a2Q,size_20,color_FFFFFF,t_70,g_se,x_16.png

📂 头文件:#include <stdio.h>


📚 针对所有输入流的格式化输入语句 - stdin / 文件


🔍 MSDN介绍:fscanf - C++ Reference

5acbec80a7a21f11edd885d09487392a_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw5qON6KKL5a2Q,size_20,color_FFFFFF,t_70,g_se,x_16.png


💬 代码演示:fscanf 的用法

61d7b75cef0d4f1b91848a0c453f20c9_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw5qON6KKL5a2Q,size_20,color_FFFFFF,t_70,g_se,x_16.png


#include <stdio.h>
int data; // 存放读到的数据
int main(void) {
    FILE* pf = fopen("test.txt", "r");
    if (pf == NULL) {
        perror("fopen");
        return 1;
    }
    // 使用fscanf读文件
    fscanf(pf, "%d", &data);
    // 将读到的数据打印
    printf("%d\n", data);
    fclose(pf);
    pf = NULL;
    return 0;
}


🚩 运行结果如下:

d9da68738b84e7dc3f28e34b45379954_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw5qON6KKL5a2Q,size_20,color_FFFFFF,t_70,g_se,x_16.png

0x02 sscanf 函数

a7f0f2cf48feb1ec6999957110182bee_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw5qON6KKL5a2Q,size_20,color_FFFFFF,t_70,g_se,x_16.png

📂 头文件:#include <stdio.h>


📚 作用:从一个字符串中读取一个格式化的数据。


🔍 MSDN介绍:sscanf - C++ Reference

864e58603371b8ff5f1c17fec03e5a6d_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw5qON6KKL5a2Q,size_20,color_FFFFFF,t_70,g_se,x_16.png



💬 代码演示:利用 sscanf 从 buffer 字符串中还原出结构体的数据


#include <stdio.h>
struct S {
  char arr[10];
  int age;
  float f;
};
int main(void) {
  struct S s = { "hello", 20, 3.14f };
  struct S tmp = { 0 };
  char buffer[100] = { 0 };
  sprintf(buffer, "%s %d %f", s.arr, s.age, s.f); // 把这些信息放到buffer中了
  printf("%s\n", buffer);
  // 从buffer字符串中还原出一个结构体数据
  sscanf(buffer, "%s %d %f", tmp.arr, &(tmp.age), &(tmp.f));
  printf("%s %d %f\n", tmp.arr, tmp.age, tmp.f);
  return 0;
}


🚩 运行结果如下:

ac6507c4531a9ea883d81173b5ab6835_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw5qON6KKL5a2Q,size_20,color_FFFFFF,t_70,g_se,x_16.png



三、总结


scanf        针对标准输入的格式化的输入语句 - stdin
fscanf       针对所有输出流的格式化的输出语句 - stdin / 文件
sscanf      从一个字符串中读取一个格式化的数据
printf         针对标准输出的格式化输出语句 - stdout
fprintf        针对所有输出流的格式化输出语句 - stdout / 文件
sprintf       把一个格式化的数据转换成字符串
相关文章
|
5天前
|
存储 Serverless C语言
【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数
本文介绍了C语言中的`gets`和`puts`函数,`gets`用于从标准输入读取字符串直至换行符,并自动添加字符串结束标志`\0`。`puts`则用于向标准输出打印字符串并自动换行。此外,文章还详细讲解了`str`系列字符串操作函数,包括统计字符串长度的`strlen`、复制字符串的`strcpy`、比较字符串的`strcmp`以及拼接字符串的`strcat`。通过示例代码展示了这些函数的具体应用及注意事项。
|
8天前
|
存储 C语言
C语言程序设计核心详解 第十章:位运算和c语言文件操作详解_文件操作函数
本文详细介绍了C语言中的位运算和文件操作。位运算包括按位与、或、异或、取反、左移和右移等六种运算符及其复合赋值运算符,每种运算符的功能和应用场景都有具体说明。文件操作部分则涵盖了文件的概念、分类、文件类型指针、文件的打开与关闭、读写操作及当前读写位置的调整等内容,提供了丰富的示例帮助理解。通过对本文的学习,读者可以全面掌握C语言中的位运算和文件处理技术。
|
8天前
|
存储 C语言
C语言程序设计核心详解 第七章 函数和预编译命令
本章介绍C语言中的函数定义与使用,以及预编译命令。主要内容包括函数的定义格式、调用方式和示例分析。C程序结构分为`main()`单框架或多子函数框架。函数不能嵌套定义但可互相调用。变量具有类型、作用范围和存储类别三种属性,其中作用范围分为局部和全局。预编译命令包括文件包含和宏定义,宏定义分为无参和带参两种形式。此外,还介绍了变量的存储类别及其特点。通过实例详细解析了函数调用过程及宏定义的应用。
|
14天前
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
14天前
|
C语言
C语言 字符串操作函数
本文档详细介绍了多个常用的字符串操作函数,包括 `strlen`、`strcpy`、`strncpy`、`strcat`、`strncat`、`strcmp`、`strncpy`、`sprintf`、`itoa`、`strchr`、`strspn`、`strcspn`、`strstr` 和 `strtok`。每个函数均提供了语法说明、参数解释、返回值描述及示例代码。此外,还给出了部分函数的自实现版本,帮助读者深入理解其工作原理。通过这些函数,可以轻松地进行字符串长度计算、复制、连接、比较等操作。
|
15天前
|
SQL 关系型数据库 C语言
PostgreSQL SQL扩展 ---- C语言函数(三)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
|
29天前
|
C语言
【C语言】字符串及其函数速览
【C语言】字符串及其函数速览
22 4
|
30天前
|
编译器 程序员 C语言
【C语言篇】从零带你全面了解函数(包括隐式声明等)(下篇)
⼀般情况下,企业中我们写代码时候,代码可能⽐较多,不会将所有的代码都放在⼀个⽂件中;我们往往会根据程序的功能,将代码拆分放在多个⽂件中。
|
1月前
|
测试技术 C语言
C语言中的void函数
C语言中的void函数
|
1月前
|
存储 安全 编译器
C语言中的scanf函数
C语言中的scanf函数