- C编程教程
- C语言 - 首页
- C语言基础
- C语言 - 概述
- C语言 - 特性
- C语言 - 历史
- C语言 - 环境搭建
- C语言 - 程序结构
- C语言 - Hello World
- C语言 - 编译过程
- C语言 - 注释
- C语言 - 词法单元
- C语言 - 关键字
- C语言 - 标识符
- C语言 - 用户输入
- C语言 - 基本语法
- C语言 - 数据类型
- C语言 - 变量
- C语言 - 整数提升
- C语言 - 类型转换
- C语言 - 类型强制转换
- C语言 - 布尔值
- C语言中的常量和字面量
- C语言 - 常量
- C语言 - 字面量
- C语言 - 转义序列
- C语言 - 格式说明符
- C语言中的运算符
- C语言 - 运算符
- C语言 - 算术运算符
- C语言 - 关系运算符
- C语言 - 逻辑运算符
- C语言 - 位运算符
- C语言 - 赋值运算符
- C语言 - 一元运算符
- C语言 - 自增和自减运算符
- C语言 - 三元运算符
- C语言 - sizeof 运算符
- C语言 - 运算符优先级
- C语言 - 其他运算符
- C语言中的决策语句
- C语言 - 决策语句
- C语言 - if 语句
- C语言 - if...else 语句
- C语言 - 嵌套 if 语句
- C语言 - switch 语句
- C语言 - 嵌套 switch 语句
- C语言中的循环
- C语言 - 循环
- C语言 - while 循环
- C语言 - for 循环
- C语言 - do...while 循环
- C语言 - 嵌套循环
- C语言 - 无限循环
- C语言 - break 语句
- C语言 - continue 语句
- C语言 - goto 语句
- C语言中的函数
- C语言 - 函数
- C语言 - 主函数
- C语言 - 按值调用函数
- C语言 - 按引用调用函数
- C语言 - 嵌套函数
- C语言 - 变参函数
- C语言 - 用户自定义函数
- C语言 - 回调函数
- C语言 - return 语句
- C语言 - 递归
- C语言中的作用域规则
- C语言 - 作用域规则
- C语言 - 静态变量
- C语言 - 全局变量
- C语言中的数组
- C语言 - 数组
- C语言 - 数组的特性
- C语言 - 多维数组
- C语言 - 向函数传递数组
- C语言 - 从函数返回数组
- C语言 - 变长数组
- C语言中的指针
- C语言 - 指针
- C语言 - 指针和数组
- C语言 - 指针的应用
- C语言 - 指针运算
- C语言 - 指针数组
- C语言 - 指向指针的指针
- C语言 - 向函数传递指针
- C语言 - 从函数返回指针
- C语言 - 函数指针
- C语言 - 指向数组的指针
- C语言 - 指向结构体的指针
- C语言 - 指针链
- C语言 - 指针与数组的区别
- C语言 - 字符指针和函数
- C语言 - 空指针
- C语言 - void 指针
- C语言 - 悬空指针
- C语言 - 指针解引用
- C语言 - 近指针、远指针和巨指针
- C语言 - 指针数组的初始化
- C语言 - 指针与多维数组的区别
- C语言中的字符串
- C语言 - 字符串
- C语言 - 字符串数组
- C语言 - 特殊字符
- C语言中的结构体和联合体
- C语言 - 结构体
- C语言 - 结构体和函数
- C语言 - 结构体数组
- C语言 - 自引用结构体
- C语言 - 查找表
- C语言 - 点 (.) 运算符
- C语言 - 枚举 (enum)
- C语言 - 结构体填充和打包
- C语言 - 嵌套结构体
- C语言 - 匿名结构体和联合体
- C语言 - 联合体
- C语言 - 位域
- C语言 - typedef
- C语言中的文件处理
- C语言 - 输入 & 输出
- C语言 - 文件 I/O (文件处理)
- C语言预处理器
- C语言 - 预处理器
- C语言 - 预处理指令
- C语言 - 预处理器运算符
- C语言 - 宏
- C语言 - 头文件
- C语言中的内存管理
- C语言 - 内存管理
- C语言 - 内存地址
- C语言 - 存储类别
- 其他主题
- C语言 - 错误处理
- C语言 - 可变参数
- C语言 - 命令执行
- C语言 - 数学函数
- C语言 - static 关键字
- C语言 - 随机数生成
- C语言 - 命令行参数
- C编程资源
- C语言 - 问答
- C语言 - 快速指南
- C语言 - 速查表
- C语言 - 有用资源
- C语言 - 讨论
C语言输入输出函数
从用户读取输入并在控制台显示(输出)是每个 C 程序都需要执行的常见任务。C 语言提供包含各种**输入输出函数**的库(头文件)。在本教程中,我们将学习不同类型的格式化和非格式化**输入输出函数**。
C语言中的标准文件
C语言将所有设备都视为文件。“显示器”等设备的寻址方式与“文件”相同。
程序执行时,以下三个文件会自动打开,以便访问键盘和屏幕。
标准文件 | 文件 | 设备 |
---|---|---|
标准输入 | stdin | 键盘 |
标准输出 | stdout | 屏幕 |
标准错误 | stderr | 屏幕 |
为了访问文件,C语言使用预定义的FILE结构体类型来引用用于读写目的的文件。阅读本章以了解如何从屏幕读取值以及如何在屏幕上打印结果。
输入输出函数的类型
C语言中,IO函数分为以下几类:
- 非格式化字符IO函数:getchar() 和 putchar()
- 非格式化字符串IO函数:gets() 和 puts()
- 格式化IO函数:scanf() 和 printf()
非格式化I/O函数以字节流的形式读取和写入数据,没有任何格式,而格式化I/O函数使用预定义的格式,例如“%d”、“%c”或“%s”,从流中读取和写入数据。
非格式化字符输入输出函数:getchar() 和 putchar()
这两个函数分别从键盘接受单个字符作为输入,并在输出终端显示单个字符。
getchar()函数读取单个按键,无需按Enter键。
int getchar(void)
不需要参数。该函数返回一个整数,该整数对应于用户输入的字符键的ASCII值。
示例1
以下程序将单个按键读入char变量:
#include <stdio.h> int main() { char ch; printf("Enter a character: "); ch = getchar(); puts("You entered: "); putchar(ch); return 0; }
输出
运行代码并检查其输出:
Enter a character: W You entered: W
示例2
以下程序演示了如何读取一系列字符,直到用户按Enter键:
#include <stdio.h> int main() { char ch; char word[10]; int i = 0; printf("Enter characters. End with pressing enter: "); while(1) { ch = getchar(); word[i] = ch; if (ch == '\n') break; i++; } printf("\nYou entered the word: %s", word); return 0; }
输出
运行代码并检查其输出:
Enter characters. End with pressing enter: Hello You entered the word: Hello
您还可以使用非格式化的putchar()函数来打印单个字符。C库函数“int putchar(int char)”将参数char指定的字符(无符号char)写入stdout。
int putchar(int c)
此函数的单个参数是要写入的字符。您还可以传递其ASCII等效整数。此函数返回写入的字符(作为无符号char强制转换为int),或在出错时返回EOF。
示例3
以下示例演示了如何使用putchar()函数:
#include <stdio.h> int main() { char ch; for(ch = 'A' ; ch <= 'Z' ; ch++) { putchar(ch); } return(0); }
输出
运行此代码时,将产生以下输出:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
格式化字符串输入输出函数:gets()、fgets()、puts()和fputs()
char *gets(char *str)函数从stdin读取一行到str指向的缓冲区,直到遇到终止换行符或EOF(文件结束)。
char *gets (char *str)
此函数只有一个参数。它是指向字符数组的指针,其中存储着C字符串。函数在成功时返回“str”,在出错或读取字符之前发生EOF时返回NULL。
示例
查看以下示例:
#include <stdio.h> int main() { char name[20]; printf("Enter your name: "); gets(name); printf("You entered the name: %s", name); return 0; }
输出
Enter your name: Ravikant Soni You entered the name: Ravikant Soni
scanf("%s")读取字符,直到遇到空格(空格、制表符、换行符等)或EOF。因此,如果您尝试输入包含多个单词(以空格分隔)的字符串,则它将接受第一个空格之前的字符作为字符串的输入。
fgets()函数
在较新的C版本中,gets()已被弃用,因为它可能是一个危险的函数,因为它不执行边界检查,并且可能导致缓冲区溢出。
建议改用fgets()函数:
fgets(char arr[], size, stream);
fgets()可用于从任何输入流(如stdin(键盘)或FILE(文件流))接受输入。
示例1
以下程序演示了如何使用fgets()从用户处接受多单词输入:
#include <stdio.h> int main () { char name[20]; printf("Enter a name: \n"); fgets(name, sizeof(name), stdin); printf("You entered: \n"); printf("%s", name); return 0; }
输出
运行代码并检查其输出:
Enter a name: Rakesh Sharma You entered: Rakesh Sharma
函数“int puts (const char *str)”将字符串's'和尾随换行符写入stdout。
int puts(const char *str)
str参数是要写入的C字符串。如果成功,它将返回一个非负值。出错时,函数返回EOF。
我们可以使用带有%s说明符的printf()函数来打印字符串。我们还可以使用puts()函数(在C11和C17版本中已弃用)或fputs()函数作为替代。
示例2
以下示例显示了puts()和fputs()之间的区别:
#include <stdio.h> int main () { char name[20] = "Rakesh Sharma"; printf("With puts(): \n"); puts(name); printf("\nWith fputs(): \n"); fputs(name, stdout); return 0; }
输出
运行代码并检查其输出:
With puts(): Rakesh Sharma With fputs(): Rakesh Sharma
格式化输入输出函数:scanf() 和 printf()
scanf()函数从标准输入流stdin读取输入,并根据提供的格式扫描该输入:
int scanf(const char *format, ...)
printf()函数将输出写入标准输出流stdout,并根据提供的格式生成输出。
int printf(const char *format, ...)
格式可以是简单的常量字符串,但您可以指定%s、%d、%c、%f等来分别打印或读取字符串、整数、字符或浮点数。还有许多其他可用的格式选项,可以根据具体要求使用。
C语言中的格式说明符
CPU 以流式方式执行与输入输出设备的IO操作。通过标准输入流从标准输入设备(键盘)读取的数据称为stdin。类似地,通过标准输出设备发送到标准输出(计算机显示屏幕)的数据称为stdout。
计算机以文本形式接收来自流的数据,但是您可能希望将其解析为不同数据类型的变量,例如int、float或字符串。类似地,存储在int、float或char变量中的数据必须以文本格式发送到输出流。格式说明符符号正是为此目的而使用的。
ANSI C 定义了许多格式说明符。下表列出了不同的说明符及其用途。
格式说明符 | 类型 |
---|---|
%c | 字符 |
%d | 带符号整数 |
%e 或 %E | 浮点数的科学计数法 |
%f | 浮点值 |
%g 或 %G | 类似于 %e 或 %E |
%hi | 带符号短整数 |
%hu | 无符号短整数 |
%i | 带符号整数 |
%l 或 %ld 或 %li | 长整数 |
%lf | 双精度浮点数 |
%Lf | 长双精度浮点数 |
%lu | 无符号整数或无符号长整数 |
%lli 或 %lld | 长长整数 |
%llu | 无符号长长整数 |
%o | 八进制表示 |
%p | 指针 |
%s | 字符串 |
%u | 无符号整数 |
%x 或 %X | 十六进制表示 |
减号 (−) 表示左对齐。百分号 (%) 后面的数字指定最小字段宽度。如果字符串小于宽度,则将用空格填充。句点 (.) 用于分隔字段宽度和精度。
示例
以下示例演示了格式说明符的重要性:
#include <stdio.h> int main(){ char str[100]; printf("Enter a value: "); gets(str); printf("\nYou entered: "); puts(str); return 0; }
输出
当编译并执行上述代码时,它会等待您输入一些文本。当您输入文本并按下 Enter 键时,程序继续并读取输入,并显示如下:
Enter a value: seven 7 You entered: seven 7
这里需要注意的是,`scanf()` 函数期望输入的格式与您提供的 “%s” 和 “%d” 相同,这意味着您必须提供有效的输入,例如“一个字符串后跟一个整数”。如果您提供两个连续的字符串“字符串 字符串”或两个连续的整数“整数 整数”,则会被认为是错误的输入集。
其次,在读取字符串时,`scanf()` 函数一遇到“空格”就停止读取,因此字符串“This is Test”实际上对于 `scanf()` 函数来说是一组三个字符串。