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 - Main 函数 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 - 指针 vs 数组 C - 字符指针和函数 C - NULL 指针 C - void 指针 C - 悬垂指针 C - 解引用指针 C - Near、Far 和 Huge 指针 C - 指针数组的初始化 C - 指针与多维数组

C 语言中的字符串

C - 字符串 C - 字符串数组 C - 特殊字符

C 语言的结构体和联合

C - 结构体 C - 结构体和函数 C - 结构体数组 C - 自引用结构 C - 查找表 C - 点 (.) 运算符 C - 枚举(或 enum) C - 结构填充和打包 C - 嵌套结构 C - 匿名结构和联合 C - 联合 C - Bit 位字段 C - Typedef

C 语言中的文件处理

C - 输入和输出 C - 文件 I/O(文件处理)

C 语言中的预处理器

C - 预处理器 C - #pragma 编译指示 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 == '
')
         break;
      i++;
   }

   printf("
You 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: 
");
   fgets(name, sizeof(name), stdin);

   printf("You entered: 
");
   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(): 
");
   puts(name);

   printf("
With fputs(): 
");
   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("
You entered: ");
   puts(str);

   return 0;
}

输出

当上述代码编译并执行时,它会等待您输入一些文本。当您输入文本并按下 Enter 键时,程序将继续读取输入并显示如下内容 -

Enter a value: seven 7
You entered: seven 7

这里需要注意的是,scanf() 函数要求输入的格式与您提供的"%s"和"%d"相同,这意味着您必须提供有效的输入,例如"一个字符串后跟一个整数"。如果您提供两个连续的字符串"string string"或两个连续的整数"integer integer",则会被视为一组错误的输入。

其次,在读取字符串时,scanf() 函数一旦遇到"空格"就会停止读取,因此对于 scanf() 函数来说,字符串"This is Test"实际上是三个字符串的组合。