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!
相关推荐
夏幻灵7 小时前
JavaScript this 面试:五种绑定规则、优先级与常见面试陷阱
开发语言·javascript·面试
程序猿编码7 小时前
榨干 RTX5090 算力!Qwen3 专用单卡推理引擎,手写C++/CUDA 算子实现 MTP 推测解码
开发语言·c++·大模型推理·qwen3·多模态推理
敬往事一杯酒哈8 小时前
海康 AGV 导航读码器学习
学习
bkspiderx8 小时前
Qt 插件机制:动态扩展应用功能的核心框架
开发语言·qt·元数据·qt 插件·qpluginloader
程序员老陆8 小时前
深入理解 C++ thread_local:线程私有存储的正确打开方式
开发语言·c++·程序设计
沐晓时光9 小时前
C语言入门,深入理解指针(3)
c语言·开发语言
码云数智-园园9 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言
qq_2842740510 小时前
机械原理笔记:平面机构自由度计算(复合铰链、局部自由度、虚约束)与四杆机构入门(含考点)
笔记·学习·平面·自动化·制造
禾小西10 小时前
07丨Redis 哨兵机制:主库故障后,如何恢复服务?
java·开发语言·redis
我不是阵雨10 小时前
JDK 21虚拟线程Pinning陷阱:一文拔钉解困
java·开发语言