当前位置: 首页 > news >正文

C 语言输入输出详解

在 C 语言编程中,输入和输出(I/O)操作是非常基础且重要的部分。输入意味着为程序提供数据,这些数据可以来自文件或者命令行;而输出则是将程序处理的结果展示在屏幕、打印机或者保存到文件中。C 语言提供了丰富的内置函数来完成这些操作。

一、标准文件

C 语言把所有设备都视为文件,因此设备(如显示器)的处理方式和文件相同。在程序执行时,会自动打开三个标准文件,用于访问键盘和屏幕:

标准文件文件指针对应设备
标准输入stdin键盘
标准输出stdout屏幕
标准错误stderr屏幕
文件指针是访问文件的关键,通过它我们可以实现从键盘读取数据以及将结果输出到屏幕等操作。  

二、常用输入输出函数

1. printf () 函数

printf() 函数用于将格式化的数据输出到标准输出设备(通常是屏幕)。

  • 语法int printf(const char *format, ...);
  • 参数说明
    • format:格式化字符串,规定了输出的格式,包含普通字符和格式说明符。
    • ...:可变参数列表,根据格式化字符串中的格式说明符,提供要输出的数据。

示例

#include <stdio.h>      // 执行 printf() 函数需要该库
int main()
{
    printf("菜鸟教程");  //显示引号中的内容
    return 0;
}

解析

  • 所有 C 语言程序都从 main() 函数开始执行。
  • printf() 函数在 stdio.h 头文件中声明,#include <stdio.h> 预处理命令用于引入该头文件,若未引入,编译器遇到 printf() 函数时会报错。
  • return 0; 表示程序正常退出。

格式化输出整数

#include <stdio.h>
int main()
{
    int testInteger = 5;
    printf("Number = %d", testInteger);
    return 0;
}

上述代码中,%d 是格式说明符,用于匹配整型变量 testInteger 并将其值输出到屏幕,输出结果为 Number = 5

格式化输出浮点型数据

#include <stdio.h>
int main()
{
    float f;
    printf("Enter a number: ");
    // %f 匹配浮点型数据
    scanf("%f",&f);
    printf("Value = %f", f);
    return 0;
}

在这个例子中,先使用 scanf() 函数从键盘读取一个浮点数,再用 printf() 函数将其输出,%f 用于格式化输出浮点数。

2. scanf () 函数

scanf() 函数用于从标准输入设备(通常是键盘)读取格式化的输入。

  • 语法int scanf(const char *format, ...);
  • 参数说明
    • format:格式化字符串,指定输入的格式,包含格式说明符。
    • ...:可变参数列表,是存储输入数据的变量地址,变量前需加 & 符号。

示例

#include <stdio.h>

int main() {
    int a;
    float b;
    printf("Enter an integer and a float: ");
    scanf("%d %f", &a, &b);
    printf("You entered: %d and %.2f\n", a, b);
    return 0;
}

执行上述代码,输入 10 3.14,输出 You entered: 10 and 3.14。注意 scanf() 对输入格式有严格要求,输入需与格式说明符匹配,且读取字符串时遇到空格会停止。

三、字符输入输出函数

1. getchar () 函数

int getchar(void) 函数从屏幕读取下一个可用的字符,并以整数形式返回。每次只能读取一个字符,可在循环中使用以读取多个字符。

2. putchar () 函数

int putchar(int c) 函数把字符输出到屏幕上,并返回相同的字符。同样每次只能输出一个字符,可在循环中输出多个字符。

示例

#include <stdio.h>
 
int main( )
{
   int c;
 
   printf( "Enter a value :");
   c = getchar( );
 
   printf( "\nYou entered: ");
   putchar( c );
   printf( "\n");
   return 0;
}

输入文本并回车后,程序会读取并输出第一个字符。

四、字符串输入输出函数

1. fgets () 函数

char *fgets(char *str, int n, FILE *stream) 函数用于从标准输入设备读取一行字符串,推荐使用,可避免缓冲区溢出问题。

  • 参数说明
    • str:指向字符数组的指针,用于存储读取的字符串。
    • n:要读取的最大字符数(包括空字符 \0)。
    • stream:文件流,通常使用 stdin 表示标准输入。

示例

#include <stdio.h>

int main() {
    char str[100];
    printf("Enter a string: ");
    fgets(str, sizeof(str), stdin);
    printf("You entered: %s", str);
    return 0;
}

2. puts () 函数

int puts(const char *str) 函数用于将一个字符串输出到标准输出设备,并自动在末尾添加换行符。成功时返回非负值,失败时返回 EOF

示例

#include <stdio.h>

int main() {
    char str[] = "Hello, World!";
    puts(str);
    return 0;
}

输出 Hello, World!

3. fputs () 函数

int fputs(const char *str, FILE *stream) 函数用于将字符串输出到指定的流(如标准输出、文件等),不会自动添加换行符。

  • 参数说明
    • str:要输出的字符串(以空字符 \0 结尾的字符数组)。
    • stream:指定输出的流,可以是标准输出(stdout)、文件流等。
  • 返回值:成功时返回非负值(通常是输出的字符数),失败时返回 EOF

示例

#include <stdio.h>

int main() {
    char str[] = "Hello, World!";
    fputs(str, stdout);  // 输出 "Hello, World!",不换行
    return 0;
}

puts () 和 fputs () 的区别

特性puts()fputs()
换行符自动添加不添加
输出流只能输出到标准输出可输出到任意流
参数一个字符串参数字符串参数和流参数
返回值成功返回非负值,失败返回 EOF成功返回非负值,失败返回 EOF

五、文件输入与输出

1. fopen () 函数

FILE *fopen(const char *filename, const char *mode) 函数用于打开一个文件。

  • 参数说明
    • filename:要打开的文件名。
    • mode:打开文件的模式,如 "r"(只读)、"w"(只写)、"a"(追加)等。
  • 返回值:成功时返回指向 FILE 对象的指针,失败时返回 NULL

2. fclose () 函数

int fclose(FILE *stream) 函数用于关闭一个已打开的文件。

  • 参数说明stream 是指向 FILE 对象的指针。
  • 返回值:成功时返回 0,失败时返回 EOF

示例

#include <stdio.h>

int main() {
    FILE *file;
    file = fopen("example.txt", "w");  // 打开文件用于写入
    if (file != NULL) {
        fprintf(file, "Hello, world!\n");  // 写入文件
        fclose(file);  // 关闭文件
    }

    char buffer[100];
    file = fopen("example.txt", "r");  // 打开文件用于读取
    if (file != NULL) {
        fscanf(file, "%s", buffer);  // 读取数据
        printf("Read from file: %s\n", buffer);
        fclose(file);  // 关闭文件
    }
    return 0;
}

通过以上对 C 语言输入输出函数的详细介绍,希望能帮助你更好地掌握 C 语言中的 I/O 操作,编写出功能更强大、更完善的程序。

 

相关文章:

  • 从零构建大语言模型全栈开发指南:第三部分:训练与优化技术-3.2.3预训练任务设计:掩码语言建模(MLM)与下一句预测(NSP)
  • 伊利工业旅游4.0,近距离感受高品质的魅力
  • Navicat连接postgresql时出现“datlastsysoid does not exist”报错的问题
  • Ruoyi-vue前后端分离系统部署
  • 如何在linux中部署dns服务 主备dns (详细全过程)
  • vue中使用threejs的加载纹理没有效果
  • 安卓-关于setOnTouchListener和setOnClickListener冲突的问题
  • 2025_0327_生活记录
  • vue配置.eslintrc、.prettierrc详解
  • 如何让 AI 搜索为您的企业可见性战略助力飞升!
  • 外贸独立站相关知识扫盲
  • 网路传输层UDP/TCP
  • 【YOLOE: Real-Time Seeing Anything】predict_visual_prompt.py视觉推理代码分析(检测版本)
  • 【漏洞修复】为了修复ARM64 Android10系统的第三方库漏洞,将ARM64 Android16的系统库直接拷贝到Android10系统如何?
  • 【HTML】验证与调试工具
  • webpack配置详解+项目实战
  • Mathtype无法插入到Word中
  • 详解Spark executor
  • (C语言)习题练习 (指针与二维数组)的长度计算
  • 基于yolov11的铁路轨道铁轨缺陷检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面
  • 百度站长平台网站提交/针对本地的免费推广平台
  • 做信息图的网站/百度百科官网首页
  • 网站的作用和意义/站长工具国色天香
  • 易语言怎么做网站自动登录/企业推广宣传方案
  • 专业的魔站建站系统/网络营销和传统营销的区别有哪些
  • 金湖县政府网站软环境效能建设/金蝶进销存免费版