C语言学习(五)——输入/输出

在C语言中,往往需要输入/输出一些数据,这些数据可能包含文件、命令等。C语言中的I/O(输入输出)通常使用scanf()和printf()两个函数进行输入和输出。

1.标准输入输出函数:scanf()和printf()

标准输入输出函数需要在在 "stdio.h" 头文件中声明。

(1)scanf()函数

scanf()函数用于从标准输入设备(通常是键盘)读取格式化的输入。其基本语法为:

cpp 复制代码
int scanf(const char *format, ...);

其中,format是格式字符串,指定输入数据的类型。...:可变参数列表,根据格式化字符串中的格式说明符,提供存储输入数据的变量地址。例如:

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int num;
	float fa;
	scanf("%d %f", &num, &fa);  // 读取整数和浮点数

}

注意:变量前需加&符号(指针变量除外)。若使用visual studio软件,需在代码的第一行定义"#define _CRT_SECURE_NO_WARNINGS",否则得用scanf_s。

cpp 复制代码
//输入
5 3.14

(2)printf()函数

printf()函数用于将格式化的数据输出到标准输出设备上。其基本语法为:

cpp 复制代码
int printf(const char *format, ...);
cpp 复制代码
int num;
float fa;
scanf("%d %f", &num,&fa);  // 读取整数和浮点数
printf("num = %d, fa = %f\n", num, fa);
printf("Hello, World!\n");  // 输出字符串
printf("Number: %d\n", 42); // 输出整数

结果:

常用的格式说明符:

  • %d:整数
  • %f:浮点数
  • %c:字符
  • %s:字符串

格式化输入输出的高级用法

printf()scanf()支持宽度、精度等格式化选项:

cpp 复制代码
printf("%5d\n", 42);    // 输出宽度为5的整数
printf("%.2f\n", 3.14159); // 输出两位小数的浮点数

使用scanf()时注意缓冲区溢出,建议指定输入长度:

scanf("%9s", str); // 最多读取9个字符

2.字符输入输出:getchar()和putchar()

getchar()putchar()用于单个字符的输入输出。

cpp 复制代码
int getchar(void);  // 从屏幕读取一个字符
int putchar(int c); // 把字符输出到屏幕上

示例:

cpp 复制代码
char c = getchar(); // 读取字符
putchar(c);         // 输出字符

结果:

cpp 复制代码
abc
a

3.字符串输入输出:gets()和puts()

gets()puts()用于字符串的输入输出,但gets()不安全,容易导致缓冲区溢出,推荐使用fgets()。其基本语法为:

cpp 复制代码
char *fgets(char *str,int n,FILE *stream);       // 读取字符串
int puts(const char *str);   // 输出字符串

其中,参数:

  • str:指向字符数组的指针,用于存储读取的字符串。

  • n:要读取的最大字符数(包括空字符\0)。

  • stream:文件流,通常使用stdin表示标准输入。

cpp 复制代码
char str[100];
fgets(str, sizeof(str), stdin); // 安全读取字符串
puts(str);                      // 输出字符串

fputs()函数

fputs() 函数用于将字符串输出到指定的流(如标准输出、文件等),但不会自动在字符串末尾添加换行符。

语法:

cpp 复制代码
int fputs(const char *str, FILE *stream);

参数:

  • str:要输出的字符串(以空字符 \0 结尾的字符数组)。

  • stream:指定输出的流,可以是标准输出(stdout)、文件流等。

返回值:

  • 成功时返回一个非负值(通常是输出的字符数)。

  • 失败时返回 EOF

cpp 复制代码
char str[100];
fgets(str, sizeof(str), stdin); // 安全读取字符串
fputs(str,stdout);              // 输出字符串但不换行

puts()和fputs()的区别:

特性 puts() fputs()
换行符 自动在字符串末尾添加换行符 不添加换行符
输出流 只能输出到标准输出(屏幕) 可以输出到任意流(如文件、屏幕)
参数 只需要一个字符串参数 需要字符串参数和流参数

4.文件输入和输出:fscanf()和fprintf()

文件操作使用fprintf()fscanf(),与printf()scanf()类似,但需指定文件指针。

cpp 复制代码
#include <stdio.h>

int main()
{
	FILE *fp;
	char str[100];
	fp = fopen("test.txt", "r");
	if (fp == NULL) {
		printf("error opening file.\n");
		return 1;
	}
	while (fgets(str, sizeof(str), fp) != NULL) {
		printf("%s", str);
	}
	fclose(fp);
	return 0;
}
cpp 复制代码
#include <stdio.h>

int main()
{
    
    FILE* file;
	file = fopen("test1.txt", "w");   // 打开文件进行写入,如果文件不存在则创建,如果存在则覆盖
    if (file != NULL)
    {
        fprintf(file, "Hello,File!\nhhhhh"); // 写入文件
        fclose(file);
    }
    
    file = fopen("test1.txt", "r");
    char buffer[200];
    if (file != NULL)
    {
        fscanf(file, "%s", buffer);      // 读取文件,但是在遇到第一个空格和换行符时,它会停止读取。
		printf("Read from file: %s\n", buffer);
        fclose(file);

    }
	return 0;
}

结果:

cpp 复制代码
Read from file: Hello,File!
相关推荐
梦幻精灵_cq2 小时前
学C之路:不可或缺的main()主函数框架(Learn-C 1st)
c语言·开发语言
消失的旧时光-19432 小时前
C++ 多线程与并发系统取向(二)—— 资源保护:std::mutex 与 RAII(类比 Java synchronized)
java·开发语言·c++·并发
学编程的闹钟2 小时前
E语言计算器开发全攻略
学习
薛定e的猫咪2 小时前
Claude Code 完整学习手册:安装配置、CCR、MCP、插件与 Superpowers开发框架
学习
雾山大叔3 小时前
多会话浏览器串口调试助手
经验分享·笔记·学习
福大大架构师每日一题3 小时前
go-zero v1.10.0发布!全面支持Go 1.23、MCP SDK迁移、性能与稳定性双提升
开发语言·后端·golang
五阿哥永琪4 小时前
1. 为什么java不能用is开头来做布尔值的参数名,会出现反序列化异常。
java·开发语言
小凯123454 小时前
pytest框架-详解(学习pytest框架这一篇就够了)
python·学习·pytest
逻极4 小时前
pytest 入门指南:Python 测试框架从零到一(2025 实战版)
开发语言·python·pytest