欢迎光临
我们一直在努力

C语言输入输出函数详解

C语言输入输出函数详解:与程序交互的桥梁

一、概述

程序与用户的交互离不开输入输出功能。C语言通过标准库函数实现输入输出,这些函数都声明在stdio.h头文件中。本章将详细介绍最常用的输入输出函数。

二、printf函数——格式化输出

2.1 printf的基本用法

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

printf("格式控制字符串", 输出参数列表);

示例:

#include <stdio.h>

int main()
{
int a = 10;
float b = 3.14;

printf("a = %d, b = %f\\n", a, b);

return 0;
}

其中,"%d"和"%f"是格式控制符,用于指定输出的格式。

2.2 整数输出格式控制符

使用printf输出整数时,需要考虑两个因素:整数的类型和输出的进制。

格式控制符含义
%d 以带符号十进制形式输出整数
%u 以无符号十进制形式输出整数
%o 以无符号八进制形式输出整数
%x 以无符号十六进制形式输出整数(小写)
%X 以无符号十六进制形式输出整数(大写)

注意:这些格式控制符默认用于int类型,可以通过前缀修饰:

前缀含义
%hd short类型
%ld long类型
%lld long long类型

int a = 255;
printf("%d\\n", a); // 输出:255
printf("%o\\n", a); // 输出:377
printf("%x\\n", a); // 输出:ff
printf("%X\\n", a); // 输出:FF
printf("%u\\n", a); // 输出:255

2.3 浮点数输出格式控制符

格式控制符含义
%f 以十形式输出浮点数进制小数
%e 以科学计数法形式输出(小写e)
%E 以科学计数法形式输出(大写E)
%g 自动选择%f或%e中较短的形式
%G 自动选择%f或%E中较短的形式

double x = 123.456;

printf("%f\\n", x); // 输出:123.456000
printf("%e\\n", x); // 输出:1.234560e+02
printf("%g\\n", x); // 输出:123.456

精度控制:可以在格式控制符中指定精度

double pi = 3.1415926;
printf("%.2f\\n", pi); // 输出:3.14(保留两位小数)
printf("%.4f\\n", pi); // 输出:3.1416(保留四位小数)

2.4 字符和字符串输出

格式控制符含义
%c 输出一个字符
%s 输出字符串

char c = 'A';
char s[] = "Hello";

printf("%c\\n", c); // 输出:A
printf("%s\\n", s); // 输出:Hello

2.5 其他格式控制符

格式控制符含义
%p 以十六进制形式输出指针地址
%% 输出百分号字符
%zu 输出size_t类型的值

int a = 10;
int *p = &a;

printf("%p\\n", p); // 输出指针地址,如:0061FF2C
printf("100%%\\n"); // 输出:100%
printf("%zu\\n", sizeof(int)); // 输出:4

2.6 宽度控制

可以通过指定宽度来控制输出格式:

int a = 123;
printf("%5d\\n", a); // 输出: 123(右对齐,总宽度5)
printf("%-5d\\n", a); // 输出:123 (左对齐,总宽度5)
printf("%05d\\n", a); // 输出:00123(不足部分用0填充)

三、scanf函数——格式化输入

3.1 scanf的基本用法

scanf函数用于从键盘(标准输入设备)读取数据到变量中。其基本格式为:

scanf("格式控制字符串", 输入参数地址列表);

重要:输入参数必须是变量的地址!

int a;
scanf("%d", &a); // 正确:传入变量a的地址

// 错误示范
// scanf("%d", a); // 错误:a是值,不是地址

3.2 scanf格式控制符

格式控制符含义
%d 读入十进制整数
%f 读入单精度浮点数(float)
%lf 读入双精度浮点数(double)
%c 读入一个字符
%s 读入一个字符串

int a;
float b;
char c;

scanf("%d", &a); // 输入一个整数
scanf("%f", &b); // 输入一个单精度浮点数
scanf("%lf", &b); // 输入一个双精度浮点数
scanf("%c", &c); // 输入一个字符

// 同时输入多个值
scanf("%d %f %c", &a, &b, &c);

3.3 scanf使用注意事项

跳过空白符

使用%d读取整数时,scanf会跳过输入缓冲区中的空白符(空格、跳格、换行),直到读到有效数字。

间隔符问题

如果scanf包含多个格式控制符,输入时这些值必须用空白符分隔:

int a, b;
scanf("%d%d", &a, &b); // 输入:10 20 或 10\\n20 都可以

字符串输入的问题

使用%s读取字符串时,遇到空白符会停止:

char name[20];
scanf("%s", name); // 如果输入"Li Lei",只会读到"Li"

这是因为%s遇到空格就认为字符串结束了。

3.4 输入缓冲区

需要理解scanf的工作原理:用户的输入会先存入输入缓冲区,只有按下回车键后,数据才会被送到内存中供scanf读取。

int a;
scanf("%d", &a); // 如果缓冲区没有数据,程序会等待用户输入

四、字符输入输出函数

4.1 putchar函数——输出单个字符

putchar函数用于向屏幕输出一个字符:

#include <stdio.h>

int main()
{
putchar('A'); // 输出:A
putchar('\\n'); // 换行

return 0;
}

4.2 getchar函数——输入单个字符

getchar函数用于从输入缓冲区读取一个字符:

#include <stdio.h>

int main()
{
char c;
c = getchar(); // 读取一个字符
putchar(c); // 输出该字符

return 0;
}

注意:getchar返回的是int类型,而不是char类型。这是因为它还可能返回EOF(文件结束标志)。

int c; // 建议用int类型接收getchar的返回值
while ((c = getchar()) != EOF) {
putchar(c);
}

五、字符串输入输出函数

5.1 puts函数——输出字符串

puts函数用于输出整个字符串:

#include <stdio.h>

int main()
{
char s[] = "Hello, World!";
puts(s); // 输出:Hello, World!

return 0;
}

特点:

  • 输出字符串后会自动换行
  • 只能输出字符串,不能混合输出其他类型数据

5.2 gets函数——输入字符串(已淘汰)

gets函数曾用于读取一行字符串,但由于它不会检查数组边界,容易造成缓冲区溢出,已被C11标准淘汰。

5.3 fgets函数——安全的字符串输入

推荐使用fgets代替gets:

char s[20];
fgets(s, sizeof(s), stdin); // 从键盘读取最多sizeof(s)-1个字符

参数说明:

  • 第一个参数:字符数组名
  • 第二个参数:数组长度
  • 第三个参数:文件指针,stdin表示标准输入(键盘)

#include <stdio.h>

int main()
{
char name[20];

printf("请输入您的名字:");
fgets(name, sizeof(name), stdin);

printf("您好,%s", name);

return 0;
}

注意:fgets会保留输入时的换行符,如果不想保留,可以使用strcspn去除:

name[strcspn(name, "\\n")] = '\\0'; // 去除换行符

六、本章小结

本章我们详细介绍了C语言的输入输出函数:

  • printf:格式化输出,支持多种格式控制符
  • scanf:格式化输入,需要特别注意取地址符
  • getchar/putchar:单个字符的输入输出
  • fgets:安全的字符串输入函数
  • 这些函数是与程序进行交互的基础,在后续的编程中会频繁使用。熟练掌握这些函数的使用方法,对C语言编程至关重要。


    下一章预告:我们将学习C语言的程序控制结构,包括条件语句和循环语句。

    赞(0)
    未经允许不得转载:171主机测评 » C语言输入输出函数详解
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址