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!
相关推荐
Brilliantwxx12 分钟前
【C++】 继承与多态(中)
开发语言·c++·笔记·算法
Aurorar0rua6 小时前
CS50 x 2024 Notes C -14
c语言·开发语言·学习方法
小短腿的代码世界7 小时前
从.qrc到rcc编译器:Qt资源系统的隐秘运作机制与大型项目性能突围
开发语言·qt
MY_TEUCK7 小时前
【2026最新Python+AI学习基础】Python 入门笔记篇
笔记·python·学习
qq_571099357 小时前
学习周报四十五
学习
2401_833269307 小时前
Java网络编程入门
java·开发语言
青瓦梦滋7 小时前
C++的IO流与STL的空间配置器
开发语言·c++
五月君_8 小时前
Bun v1.3.14 发布,Rust 版即将进 Claude Code 内测,下一版可能就告别 Zig
开发语言·后端·rust
鱼很腾apoc9 小时前
【学习篇】第20期 超详解 C++ 多态:从语法规则到底层原理
java·c语言·开发语言·c++·学习·算法·青少年编程
不吃土豆的马铃薯10 小时前
4.SGI STL 二级空间配置器 allocate 与_S_refill 源码解析
c语言·开发语言·c++·dreamweaver·内存池