C语言中的字符输入/输出和验证输入

在C语言中,字符输入/输出功能允许程序与用户进行交互,读取用户的输入信息并展示输出结果。同时,验证输入的作用在于确保用户输入的数据符合预期,以提高程序的稳定性和可靠性,防止无效输入引发的错误或异常行为,从而提供更好的用户体验。

基础概念

  • 输入(Input):指的是向程序填充数据的过程,通常来源于用户输入、文件读取或其他外部数据源。

  • 输出(Output):指的是将数据显示在屏幕上、打印机上或写入文件的过程。

  • 缓冲区

    • 输入/输出操作通常通过缓冲区进行,以提高效率。
    • 用户输入的字符首先存储在输入缓冲区,直到程序准备好读取。
    • 程序输出的字符首先写入输出缓冲区,然后在适当的时机(如缓冲区满或遇到换行符)刷新到输出设备。
  • 输入验证

    • 输入验证是检查用户输入是否符合程序预期或特定格式的过程。
    • 它是确保程序健壮性和安全性的重要步骤。
    • 防止无效或恶意输入导致程序崩溃或产生不可预测的行为。
    • 确保用户输入的数据符合程序内部逻辑的要求。
  • 验证方法

    • 格式验证:检查输入是否符合预期的格式,如日期、电子邮件地址等。
    • 范围验证:确保输入值在预期的范围内,如年龄、价格等。
    • 类型验证:确认输入是预期的数据类型,如整数、浮点数等。

在C语言中还有EOF和 FILE两个重要概念,分别代表文件结束标记和文件类型:

  • EOF
    EOF(End Of File)是一个预定义的宏,通常在 <stdio.h>头文件中定义。它表示文件的结束标记,用于在读取文件时检测是否已经到达文件的末尾。在大多数系统中,EOF 的值通常是 -1,但这个值并不是由C标准规定的,而是依赖于具体的系统和编译器,当使用如 scanf(), fgetc(), fgets() 等函数读取文件时,如果到达文件末尾,这些函数通常会返回 EOF,从而允许程序知道已经没有更多的数据可以读取了。

  • FILE
    FILE是C标准库 <stdio.h>中定义的一个结构体类型,用于表示一个文件流。这个结构体包含了管理文件所需的所有信息,如文件描述符、缓冲区、位置指示器等,C标准库提供了一系列的函数来操作 FILE 类型的对象,如 fopen(), fclose(), fread(), fwrite(), fseek(), ftell() 等。这些函数使得C语言程序能够以高级的方式处理文件,而无需关心底层操作系统的细节。

  • 输入验证与缓冲区的关系
    在进行输入验证时,需要注意缓冲区中可能残留的数据。例如,如果用户输入了不符合要求的数据,这些数据可能会留在stdin缓冲区中。在下次输入时,如果不先清空缓冲区,这些残留数据可能会被误读为新的输入,导致程序出错。因此,在进行输入验证时,需要妥善处理缓冲区中的数据。

单字符标准输入

函数名描述
getchar从标准输入(stdin)读取一个字符

C语言中的单字符输入使用 getchar() 函数, getchar()函数可以读取用户在终端输入的一个字符。

// getchar.c
#include <stdio.h>  
int main() {printf("请输入一个字符:\n");  char ch = getchar();  // 在终端输入一个字符  printf("你输入的字符是:%c\n", ch);  // 输出输入的字符  return 0;  
}

在这里插入图片描述

单字符标准输出

函数名描述
putchar输出一个字符到标准输出(stdout)
#include <stdio.h>  
int main() {char ch = 'a';putchar(ch);return 0;  
}

在这里插入图片描述

标准输入

函数名描述
scanf从标准输入(stdin)读取格式化的数据
fgets从标准输入(stdin)读取一个字符串,直到遇到换行符或EOF(也可用于标准输入)(gets函数已被弃用)

sacnf()函数

在C语言中使用 scanf()函数 从标准输入读取数据,并根据指定的格式进行解析。虽然它不仅仅用于字符输入,但可以用来读取字符或字符串。

#include <stdio.h>    
int main() {  char name[20];  int age;  float height;  printf("你好呀老铁,你叫什么名字?:\n");  scanf("%19s", name); // %19s 限制输入的最大字符数为19,防止溢出  printf("你今年几岁了?:\n");  scanf("%d", &age);  printf("你多高呀?:\n");  scanf("%f", &height);  printf("你好呀%s,你今年%d岁了,身高%.2f米。\n", name, age, height);  return 0;  
}

fgets()
函数用于从指定的文件流中读取一行数据,直到达到指定的字符数,或者读到换行符或EOF为止。

stdin
是C语言中的一个标准输入流,它是一个指向FILE的指针,一般情况下,stdin与程序的标准输入设备(比如键盘键盘)相关联,可以使用像fgets这样的函数从stdin中读取数据。

sscanf
函数用于从一个字符串中读取与指定格式匹配的输入。

#include <stdio.h>  
#include <string.h>  // 定义用户信息的结构体  
typedef struct {  char name[20];  int age;  float height;  
} UserInfo;  int main() {  UserInfo user;  char buffer[100];  printf("你好呀老铁,你叫什么名字?:\n");  fgets(buffer, sizeof(buffer), stdin); buffer[strcspn(buffer, "\n")] = 0;strncpy(user.name, buffer, sizeof(user.name) - 1); printf("你今年几岁了?:\n");  fgets(buffer, sizeof(buffer), stdin);  sscanf(buffer, "%d", &user.age); printf("你多高呀?:\n");  fgets(buffer, sizeof(buffer), stdin);  sscanf(buffer, "%f", &user.height); printf("你好呀%s,你今年%d岁了,身高%.2f米。\n", user.name, user.age, user.height);  return 0;  
}

标准输出

函数名描述
printf将格式化的数据输出到标准输出(stdout)
puts输出一个字符串到标准输出(stdout),并在末尾添加换行符
#include <stdio.h>  int main() {  printf("Hello, World!\n");  printf("This is a number: %d\n", 123);  printf("This is a floating point number: %.2f\n", 3.14159);  printf("This is a character: %c\n", 'A');  printf("This is a string: %s\n", "Hello from a string");  puts("This is a line printed by puts function.");  return 0;  
}

puts函数适用于简单的字符串输出需求,尤其是当需要在输出后自动换行的时候,printf函数则更加灵活和强大,适用于需要格式化输出或同时输出多种数据类型的情况。
在这里插入图片描述

输入输出流

函数名描述
fopen打开一个文件,并返回一个与之相关联的文件指针
fclose关闭一个打开的文件流
fprintf将格式化的数据写入文件
fscanf从文件中读取格式化的数据
fputc将一个字符写入到指定的文件流中
fgetc从指定的文件流中读取一个字符
fputs将一个字符串写入到指定的文件流中
fgets从指定的文件流中读取一个字符串,直到遇到换行符或EOF
fwrite将一块数据写入到指定的文件流中
fread从指定的文件流中读取一块数据
fseek设置文件流的位置指示器
ftell返回当前文件流的位置指示器
fflush刷新一个输出或更新文件流
setvbuf设置文件流的缓冲模式

在运行以下代码前需要在c语言文件所在的文件夹里先新建一个 example.txt 文件,并在里面输入一些内容。

fopen
打开一个文件,并返回一个与之相关联的文件指针

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "w"); // 打开文件用于写入if (file == NULL) {perror("Error opening file");return 1;}printf("File opened successfully.\n");fclose(file); // 关闭文件return 0;
}

在这里插入图片描述

fclose
关闭一个打开的文件流

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "w");if (file) {printf("File opened successfully.\n");fclose(file); printf("File closed successfully.\n");} else {perror("Error opening file");}return 0;
}

在这里插入图片描述

fprintf
将格式化的数据写入文件

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "w");if (file) {fprintf(file, "Hello GGBond\n"); // 写入格式化字符串fclose(file);} else {perror("Error opening file");}return 0;
}

在这里插入图片描述

fscanf
从文件中读取格式化的数据

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "r");if (file) {char buffer[100];if (fscanf(file, "%99s", buffer) == 1) { // 读取格式化字符串printf("Read: %s\n", buffer);}fclose(file);} else {perror("Error opening file");}return 0;
}

在这里插入图片描述
fputc
将一个字符写入到指定的文件流中

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "w");if (file) {fputc('A', file); // 在文件里写入字符Afclose(file);} else {perror("Error opening file");}return 0;
}

在这里插入图片描述

fgetc
从指定的文件流中读取一个字符

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "r");if (file) {char ch = fgetc(file); // 读取一个字符if (ch != EOF) {printf("Read character: %c\n", ch);}fclose(file);} else {perror("Error opening file");}return 0;
}

在这里插入图片描述

fputs
将一个字符串写入到指定的文件流中

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "w");if (file) {fputs("Hello, World!\n", file); // 写入一个字符串fclose(file);} else {perror("Error opening file");}return 0;
}

在这里插入图片描述

fgets
从指定的文件流中读取一个字符串,直到遇到换行符或EOF

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "r");if (file) {char buffer[100];if (fgets(buffer, sizeof(buffer), file)) { // 读取一个字符串printf("Read string: %s", buffer);}fclose(file);} else {perror("Error opening file");}return 0;
}

在这里插入图片描述

fwrite
将一块数据写入到指定的文件流中

#include <stdio.h>int main() {FILE *file = fopen("example.bin", "wb");if (file) {int data[] = {1, 2, 3, 4, 5};fwrite(data, sizeof(int), 5, file); // 写入一块数据fclose(file);} else {perror("Error opening file");}return 0;
}

在这里插入图片描述

fread
从指定的文件流中读取一块数据

#include <stdio.h>int main() {FILE *file = fopen("example.bin", "rb");if (file) {int data[5];fread(data, sizeof(int), 5, file); // 读取一块数据for (int i = 0; i < 5; i++) {printf("%d ", data[i]);}printf("\n");fclose(file);} else {perror("Error opening file");}return 0;
}

在这里插入图片描述

fseek 和 ftell
设置文件流的位置指示器 和 返回当前文件流的位置指示器

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "r");if (file) {fseek(file, 0, SEEK_END); // 定位到文件末尾long size = ftell(file); // 获取当前位置,即文件大小printf("File size: %ld bytes\n", size);fclose(file);} else {perror("Error opening file");}return 0;
}

在这里插入图片描述

fflush
刷新一个输出或更新文件流

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "w");if (file) {fprintf(file, "Hello, World!\n");fflush(file); // 强制刷新缓冲区,确保数据写入文件fclose(file);} else {perror("Error opening file");}return 0;
}

setvbuf
设置文件流的缓冲模式

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "w");if (file) {if (setvbuf(file, NULL, _IONBF, 0) != 0) { // 设置为不带缓冲perror("Error setting buffer");} else {printf("Buffer set successfully.\n");}fclose(file);} else {perror("Error opening file");}return 0;
}

在这里插入图片描述

输入验证函数

函数名描述
feof检查文件流是否已到达文件末尾(EOF)
ferror检查文件流是否有错误发生
clearerr清除文件流的错误标志和EOF标志

新建一个example.txt文件,在里面随意输入内容,随后新建C语言文件:

#include <stdio.h>
#include <stdlib.h>int main() {FILE *file;char buffer[100];file = fopen("example.txt", "r");if (file == NULL) {perror("Error opening file");return 1;}// 尝试从文件中读取数据,直到遇到EOF或发生错误while (fgets(buffer, sizeof(buffer), file) != NULL) {printf("%s", buffer);}// 使用feof检查是否已到达文件末尾if (feof(file)) {printf("End of file reached.\n");}// 使用ferror检查文件流是否有错误发生if (ferror(file)) {printf("An error occurred during file operations.\n");}// 使用clearerr清除文件流的错误标志和EOF标志clearerr(file);// 再次检查以确认标志已被清除if (!feof(file) && !ferror(file)) {printf("EOF and error flags have been cleared.\n");}fclose(file);return 0;
}

运行后在终端输出如下内容:
在这里插入图片描述

函数名称及用法表

单字符标准输入

函数名描述标准使用方法
getchar从标准输入(stdin)读取一个字符int ch = getchar();

单字符标准输出

函数名描述标准使用方法
putchar输出一个字符到标准输出(stdout)putchar('A');

标准输入

函数名描述标准使用方法
scanf从标准输入(stdin)读取格式化的数据int num; scanf("%d", &num);
fgets从标准输入(stdin)读取一个字符串,直到遇到换行符或EOFchar buffer[100]; fgets(buffer, 100, stdin);

标准输出

函数名描述标准使用方法
printf将格式化的数据输出到标准输出(stdout)printf("Hello, World!\n");
puts输出一个字符串到标准输出(stdout),并在末尾添加换行符puts("Hello, World!");

输入输出流

函数名描述标准使用方法
fopen打开一个文件,并返回一个与之相关联的文件指针FILE *fp = fopen("file.txt", "r");
fclose关闭一个打开的文件流fclose(fp);
fprintf将格式化的数据写入文件fprintf(fp, "Hello, File!\n");
fscanf从文件中读取格式化的数据int num; fscanf(fp, "%d", &num);
fputc将一个字符写入到指定的文件流中fputc('A', fp);
fgetc从指定的文件流中读取一个字符int ch = fgetc(fp);
fputs将一个字符串写入到指定的文件流中fputs("Hello, File!\n", fp);
fgets从指定的文件流中读取一个字符串,直到遇到换行符或EOFchar buffer[100]; fgets(buffer, 100, fp);
fwrite将一块数据写入到指定的文件流中char data[5] = "data"; fwrite(data, sizeof(char), 4, fp);
fread从指定的文件流中读取一块数据char buffer[4]; fread(buffer, sizeof(char), 4, fp);
fseek设置文件流的位置指示器fseek(fp, 10, SEEK_SET);
ftell返回当前文件流的位置指示器long pos = ftell(fp);
fflush刷新一个输出或更新文件流fflush(fp);
setvbuf设置文件流的缓冲模式setvbuf(fp, NULL, _IONBF, 0);

输入验证函数

函数名描述标准使用方法
feof检查文件流是否已到达文件末尾(EOF)if (feof(fp)) { /* EOF reached */ }
ferror检查文件流是否有错误发生if (ferror(fp)) { /* Error occurred */ }
clearerr清除文件流的错误标志和EOF标志clearerr(fp);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/33001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaWeb——MySQL:DDL操作库

目录 1.DDL&#xff1a;查询数据库&#xff1b; 1.1 查询数据库 1.2 创建数据库 1.DDL&#xff1a;查询数据库&#xff1b; 具体操作&#xff1a;增 删 查 用 &#xff1b; 1.1 查询数据库 SQL语句&#xff1a;show databases; 由于我创建过一些数据库&#xff0c;我查询的…

[Spring Boot]Netty-UDP客户端

文章目录 简述Netty-UDP集成pom引入ClientHandler调用 消息发送与接收在线UDP服务系统调用 简述 最近在一些场景中需要使用UDP客户端进行&#xff0c;所以开始集成新的东西。本文集成了一个基于netty的SpringBoot的简单的应用场景。 Netty-UDP集成 pom引入 <!-- netty --…

计算机专业:昔日万金油,明日科技潮头的弄潮儿

高考后的十字路口&#xff1a;计算机专业&#xff0c;依旧闪耀吗&#xff1f; 随着2024年高考的尘埃落定&#xff0c;数百万青春洋溢的脸庞再次凝视着未来的迷雾&#xff0c;试图在繁星点点的专业宇宙中找到那颗最亮的星——计算机科学与技术。长久以来&#xff0c;计算机专业…

【目标检测】DAB-DETR

一、引言 论文&#xff1a; DAB-DETR: Dynamic Anchor Boxes are Better Queries for DETR 作者&#xff1a; IDEA 代码&#xff1a; DAB-DETR 注意&#xff1a; 该算法是对DETR的改进&#xff0c;在学习该算法前&#xff0c;建议掌握多头注意力、Sinusoidal位置编码、DETR等相…

Android jetpack Room的简单使用

文章目录 项目添加ksp插件添加 room 引用开始使用room1. 创建bean2. 创建 dao类3. 创建database类 数据库升级复制数据库到指定路径参考文献 项目添加ksp插件 注意&#xff0c;因为ksp插件 是跟项目中使用的kotlin的版本要保持一致的&#xff0c;否则会报错的 首先我们去 https…

Python18 数据结构与数据类型转换

1.python中的数据结构 在Python中&#xff0c;数据结构是用来存储、组织和管理数据的方式&#xff0c;以便有效地执行各种数据操作。Python提供了几种内置的数据结构&#xff0c;每种都有其特定的用途和操作方法。以下是Python中一些主要的数据结构&#xff1a; 1.列表&#…

攻防世界-2-1

下载附件&#xff0c;发现是一张损坏的png文件&#xff0c;扔winhex里面修改文件头 修改之后发现还是打不开&#xff0c;提示CRC错误&#xff0c;脚本跑一下 循环冗余校验CRC&#xff08;Cyclic Redundancy Check&#xff09;是数据通信领域常用的一种数据传输检错技术。通过在…

记录Nuxt3部署线上pm2启动项目修改端口

看官方文档&#xff1a; TNND&#xff0c;修改这个端口号顶个P用&#xff0c;毛用也没有 实际上应该是这样&#xff1a; 好了&#xff0c;误人子弟&#xff5e;

太速科技-基于AD916X的直流至 12 GHz 矢量信号发生器 FMC子卡

基于AD916X的直流至 12 GHz 矢量信号发生器 FMC子卡 一、DAC 性能指标&#xff1a; ● DAC 型号&#xff1a;AD9163。 ● 分辨率&#xff1a;16bits。 ● DAC 更新速率&#xff1a;12GSPS。 ● 6GSPS 直接 RF 频率合成。 ● 直流至 3GHz&#xff08;不归零 NRZ 模式&…

粉笔1000题——判断推理

目录 一、图形推理1. 位置规律平移旋转、翻转 二、定义判断三、类比推理四、逻辑判断 一、图形推理 1. 位置规律 平移 旋转、翻转 二、定义判断 三、类比推理 四、逻辑判断

Python+Pytest+Yaml+Request+Allure框架源代码之(一)common公共方法封装

common模块&#xff1a; get_path.py&#xff1a;获取路径方法 # -*- coding: UTF-8 -*- import os# 项目根目录 BASE_DIR os.path.dirname(os.path.dirname(os.path.abspath(__file__)))# 配置文件目录 CONFIG_DIR os.path.join(BASE_DIR,config)# 测试用例文件目录 TESTCA…

[SAP ABAP] 删除内表数据

1.利用索引删除数据 语法格式 DELETE <itab> INDEX <idx>. <itab>&#xff1a;代表内表 <idx>&#xff1a;代表索引值 删除内表<itab>中的第<idx>条记录 示例1 lt_student内表中存在3条数据记录 我们使用如下指令删除内表中的第一条数…

Linux 7种 进程间通信方式

传统进程间通信 通过文件实现进程间通信 必须人为保证先后顺序 A--->硬盘---> B&#xff08;B不知道A什么时候把内容传到硬盘中&#xff09; 1.无名管道 2.有名管道 3.信号 IPC进程间通信 4.消息队列 5.共享内存 6.信号灯集 7.socket通信 一、无名管道&a…

mysql中in参数过多该如何优化

优化方式概述 未优化前 SELECT * FROM rb_product rb where sku in(1022044,1009786)方案2示例 public static void main(String[] args) {//往list里面设置3000个值List<String> list new ArrayList<>();for (int i 0; i < 3000; i) {list.add(""…

我在高职教STM32——LCD液晶显示(3)

大家好&#xff0c;我是老耿&#xff0c;高职青椒一枚&#xff0c;一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次&#xff0c;同行应该都懂的&#xff0c;老师在课堂上教学几乎是没什么成就感的。正因如此&#xff0c;才有了借助 CSDN 平台寻求认同感和成就…

一键智能整理TXT文档,高效删除连续行,轻松提升工作效率与数据管理效能

信息爆炸的时代&#xff0c;TXT文档作为我们日常工作中不可或缺的一部分&#xff0c;承载着大量的数据和信息。然而&#xff0c;随着文档内容的不断增加&#xff0c;连续重复的行数也逐渐增多&#xff0c;这不仅影响了文档的整洁度&#xff0c;还大大降低了我们处理数据的效率。…

Monica

在 《long long ago》中&#xff0c;我论述了on是一个刚出生的孩子的脐带连接在其肚子g上的形象&#xff0c;脐带就是long的字母l和字母n&#xff0c;l表脐带很长&#xff0c;n表脐带曲转冗余和连接之性&#xff0c;on表一&#xff0c;是孩子刚诞生的意思&#xff0c;o是身体&a…

24年下半年各省自考报名时间汇总

24年下半年各省自考报名时间汇总

2024年【N1叉车司机】考试及N1叉车司机考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 N1叉车司机考试是安全生产模拟考试一点通总题库中生成的一套N1叉车司机考试题库&#xff0c;安全生产模拟考试一点通上N1叉车司机作业手机同步练习。2024年【N1叉车司机】考试及N1叉车司机考试题库 1、【多选题】《中…

独角兽品牌獭崎酱酒:高性价比的酱香之选

在酱香型白酒领域中&#xff0c;獭崎酱酒以其独特的品牌定位和高性价比迅速崛起&#xff0c;成为市场上备受关注的独角兽品牌。作为贵州茅台镇的一款新秀酱香酒&#xff0c;獭崎酱酒不仅传承了百年酿造工艺&#xff0c;还以创新的商业模式和亲民的价格赢得了广大消费者的青睐。…