(21)从strerror到strtok:解码C语言字符函数的“生存指南2”

折枝寄北主页图
❤个人主页:折枝寄北的博客
❤专栏位置:简单入手C语言专栏

目录

  • 前言
  • 1. 错误信息报告
    • 1.1 strerror
  • 2. 字符操作
    • 2.1 字符分类函数
    • 2.2 字符转换函数
  • 3. 内存操作函数
    • 3.1 memcpy
    • 3.2 memmove
    • 3.2memset
    • 3.3 memcmp
  • 感谢您的阅读

前言

当你写下strcpy(dest, src)这行看似无害的代码时,是否意识到自己正在操作系统的血管里进行一场没有安全绳的高空走钢丝?在C语言的世界里,字符串从来都不是温顺的数据羔羊,而是戴着可爱面具的"内存刺客"——那些优雅的str开头的函数库,既是程序员最亲密的工具,也是引发段错误(Segmentation Fault)的经典元凶。

1. 错误信息报告

1.1 strerror

标准格式:

char * strerror ( int errnum );

功能:

获得指向错误信息的地址 C语言的库函数在运行的时候,如果发生错误,就会将错误存在一个变量中,这个(全局)变量是:errno
错误码是一些数字:1,2,4,5。。。 我们需要将错误码翻译成错误信息

代码示例部分:
示例一

#include <stdio.h>
#include <string.h>
#include <errno.h>//必须包含的头文件
int main ()
{
  FILE * pFile;
  pFile = fopen ("unexist.ent","r");
  if (pFile == NULL)
    printf ("Error opening file unexist.ent: %s\n",strerror(errno));
    //errno: Last error number
  return 0;
}

示例二

int main()
{
	printf("%s\n", strerror(0));
	printf("%s\n", strerror(1));
	printf("%s\n", strerror(2));
	printf("%s\n", strerror(3));
	printf("%s\n", strerror(4));
	printf("%s\n", strerror(5));

	return 0;
}


#include<errno.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n",strerror(errno));
		//perror  打印错误信息
		//在打印错误信息前,会先打印自定义的信息
		perror("fopen");
		//printf("文件打开失败\n");
		return 1;
	}
	else
	{
		printf("文件打开成功\n");
	}
	//关闭文件
	fclose(pf);
	return 0;
	//如果文件打开成功,会返回一个有效的指针
	//打开失败,返回一个NULL指针
}

2. 字符操作

简单列举出部分字符操作函数,供大家自行学习。(全写出来篇幅过长,不易阅读)

2.1 字符分类函数

函数 --------如果他的参数符合下列条件就返回真
1.iscntrl----- 任何控制字符
2.isspace -----空白字符:空格‘ ’,换页‘\f’,换行’\n’,回车‘\r’,制表符’\t’或者垂直制表符’\v’
3.isdigit---- 十进制数字 0~9
4.isxdigit ----十六进制数字,包括所有十进制数字,小写字母a-f,大写字母A~F
5.islower---- 小写字母a~z
6.isupper ----大写字母A~Z
7.isalpha ----字母a-z或A~Z
8.isalnum ----字母或者数字,a-z,A-Z,0~9
9.ispunct ----标点符号,任何不属于数字或者字母的图形字符(可打印)
10.isgraph ----任何图形字符
11.isprint ----任何可打印字符,包括图形字符和空白字符

2.2 字符转换函数

int tolower ( int c );
int toupper ( int c );

代码示例:

字符转换
eg:I Have Apple.
int main()
{
	char arr[] = "I Have Apple.";
	int i = 0;
	while (arr[i])
	{
		if (isupper(arr[i]))
		{
			arr[i] = tolower(arr[i]);
		}
		printf("%c", arr[i]);
		i++;
	}
	return 0;
}

3. 内存操作函数

3.1 memcpy

标准格式:

void * memcpy ( void * destination, const void * source, size_t num );

功能:

strcpy只能拷贝字符串
memcpy可以拷贝其他类型的数据

注意:

  • 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
  • 这个函数在遇到 ‘\0’ 的时候并不会停下来。
  • 如果source和destination有任何的重叠,复制的结果都是未定义的。
    代码示例部分:
#include <stdio.h>
#include <string.h>
struct
 {
  char name[40];
  int age;
} person, person_copy;
int main ()
{
  char myname[] = "Pierre de Fermat";
  /* using memcpy to copy string: */
  memcpy ( person.name, myname, strlen(myname)+1 );
  person.age = 46;
  /* using memcpy to copy structure: */
  memcpy ( &person_copy, &person, sizeof(person) );
  printf ("person_copy: %s, %d \n", person_copy.name, person_copy.age );
  return 0;
}

3.2 memmove

标准格式:

void * memmove ( void* destination, const void * source, size_t num );

功能及注意:

1.和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
2.如果源空间和目标空间出现重叠,就得使用memmove函数处理。

代码示例部分:

include <stdio.h>
#include <string.h>
int main ()
{
  char str[] = "memmove can be very useful......";
  memmove (str+20,str+15,11);
  puts (str);
  return 0;
}

3.2memset

功能:

以字节为单位来设置内存中的数据

代码示例部分:

int main()
{
	char arr[] = "hello world";
	memset(arr, 'x', 5);
	printf("%s\n", arr);
	memset(arr+6, 'y', 5);
	printf("%s\n", arr);

	return 0;
}

3.3 memcmp

标准格式:

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

功能:

比较从ptr1和ptr2指针开始的num个字节

代码示例部分:

#include <stdio.h>
#include <string.h>
int main ()
{
  char buffer1[] = "DWgaOtP12df0";
  char buffer2[] = "DWGAOTP12DF0";
  int n;
  n=memcmp ( buffer1, buffer2, sizeof(buffer1) );
  if (n>0) printf ("'%s' is greater than '%s'.\n",buffer1,buffer2);
  else if (n<0) printf ("'%s' is less than '%s'.\n",buffer1,buffer2);
  else printf ("'%s' is the same as '%s'.\n",buffer1,buffer2);
  return 0;
}

感谢您的阅读

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

wpf中如何让TextBox 显示字体的颜色为白色

在 WPF 中&#xff0c;要让 TextBox 的字体颜色显示为白色&#xff0c;可以通过以下方法实现&#xff1a; 方法 1&#xff1a;直接设置 Foreground 属性&#xff08;XAML&#xff09; 在 XAML 中直接为 TextBox 设置 Foreground 属性&#xff0c;使用 White 颜色&#xff1a; …

小白向-python实现插入排序算法

插入排序 一、插入排序的定义 插入排序&#xff08;Insertion Sort&#xff09;是一种稳定的排序算法&#xff0c;通过构建有序序列&#xff0c;逐步将新元素插入到正确位置&#xff0c;最终完成排序。 二、插入排序的发展历史 插入排序是一种古老且直观的排序算法&#xff…

python-leetcode-最长公共子序列

1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:m, n len(text1), len(text2)dp [[0] * (n 1) for _ in range(m 1)]for i in range(1, m 1):for j in range(1, n …

mac电脑中使用无线诊断.app查看连接的Wi-Fi带宽

问题 需要检查连接到的Wi-Fi的AP硬件支持的带宽。 步骤 1.按住 Option 键&#xff0c;然后点击屏幕顶部的Wi-Fi图标&#xff1b;2.从下拉菜单中选择 “打开无线诊断”&#xff08;Open Wireless Diagnostics&#xff09;&#xff1b;3.你可能会看到一个提示窗口&#xff0c;…

什么是模型量化和模型蒸馏?

文章目录 一、模型量化二、模型蒸馏三、二者有联系吗&#xff1f;四、示例场景五、总结 一、模型量化 模型量化&#xff08;Model Quantization&#xff09;是一种优化技术&#xff0c;通过将模型的参数和计算从高精度&#xff08;如 32 位浮点数&#xff0c;FP32&#xff09;…

Asp.Net Web API| React.js| EF框架 | SQLite|

asp.net web api EF SQLiteReact前端框架 设计一个首页面&#xff0c;包含三个按钮分别对应三类用户&#xff08;数据查看&#xff0c;设计人员&#xff0c;管理员&#xff09;&#xff0c;当点击管理员的时候弹出一个前端页面可以输入信息&#xff08;以学生数据为例&#…

英文论文查重,Turnitin和IThenticate两个系统哪个更合适?

Turnitin系统和IThenticate系统都是检测英文论文的查重系统&#xff0c;但是两者之间还是有一些不一样的。 下面针对这两个系统给大家具体分析一下。 一、Turnitin系统 Turnitin检测系统&#xff1a; https://truth-turnitin.similarity-check.com Turnitin是世界上主流的…

Unity Dedicated Server 控制台 输出日志LOg 中文 乱码

现象: 中文乱码 原因: Unity打包出来的.exe文件&#xff0c;语言一栏是英文&#xff0c;VS控制台出来不一样 解决方案: 新建.bat文件 &#xff0c;并使用命令chcp 65001&#xff0c;运行时启动.bat&#xff0c;而不是.exe, 改不了exe属性&#xff0c;虽然有点奇怪&#xff…

Cesium高级开发教程之四十三:缓冲区分析#面

一、简介 基本概念:面缓冲区分析是指围绕一个给定的面几何对象,根据指定的距离,在面的外部或内部生成一个新的面状区域。例如,对于一个表示湖泊的面要素,通过设置一定的缓冲距离,可以在湖泊周围生成一个环状的缓冲区域,用于分析湖泊周边的生态环境影响范围等;或者在一个…

18439二维前缀和

18439二维前缀和 ⭐️难度&#xff1a;中等 &#x1f4d6; &#x1f4da; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();int m scanner.nextInt();int q s…

PwnLab详细解答

一、主机发现 arp-scan -l靶机ip&#xff1a;192.168.55.153 二、端口识别、目录枚举、指纹识别 2.1端口识别 nmap -p- 192.168.55.1532.2目录枚举 dirb http://192.168.55.153枚举出来的敏感目录找到了文件上传网站和上传的地址 2.3指纹识别 nmap 192.168.55.153 -sV -…

傅里叶分析

傅里叶分析之掐死教程&#xff08;完整版&#xff09;更新于2014.06.06 要让读者在不看任何数学公式的情况下理解傅里叶分析。 傅里叶分析不仅仅是一个数学工具&#xff0c;更是一种可以彻底颠覆一个人以前世界观的思维模式。但不幸的是&#xff0c;傅里叶分析的公式看起来太复…

unity学习56:旧版legacy和新版TMP文本输入框 InputField学习

目录 1 旧版文本输入框 legacy InputField 1.1 新建一个文本输入框 1.2 InputField 的子物体构成 1.3 input field的的component 1.4 input Field的属性 2 过渡 transition 3 控件导航 navigation 4 占位文本 placeholder 5 文本 text 5.1 文本内容&#xff0c;用户…

详解Tomcat下载安装以及IDEA配置Tomcat(2023最新)

目录 步骤一&#xff1a;首先确认自己是否已经安装JDK步骤二&#xff1a;下载安装Tomcat步骤三&#xff1a;Tomcat配置环境变量步骤四&#xff1a;验证Tomcat配置是否成功步骤五&#xff1a;为IDEA配置Tomcat 步骤一&#xff1a;首先确认自己是否已经安装JDK jdk各版本通用安…

《Qt动画编程实战:轻松实现头像旋转效果》

《Qt动画编程实战&#xff1a;轻松实现头像旋转效果》 Qt 提供了丰富的动画框架&#xff0c;可以轻松实现各种平滑的动画效果。其中&#xff0c;旋转动画是一种常见的 UI 交互方式&#xff0c;广泛应用于加载指示器、按钮动画、场景变换等。本篇文章将详细介绍如何使用 Qt 实现…

从零构建知识库:AI如何实现“问题即答案”?

在当今这个信息爆炸的时代&#xff0c;如何高效地获取和利用知识成为了各行各业面临的共同挑战。构建知识库&#xff0c;作为整合、存储和检索信息的重要手段&#xff0c;正在逐步成为企业提升竞争力的关键。而AI技术的加入&#xff0c;更是让这一过程实现了质的飞跃&#xff0…

PhotoDoodle: Learning Artistic Image Editing from Few-Shot Examples 论文解读

目录 一、概述 二、PhotoDoodle 1、OmniEditor的预训练 2、DiT重点 3、无噪声条件范式与CFM 4、EditLoRA 4.1关于LoRA 4.2关于EditLoRA 三、相关工作 一、概述 风格化图像编辑的论文&#xff01; 介绍了PhotoDoodle&#xff0c;一个基于扩散模型的图像编辑框架&#x…

RabbitMQ操作实战

1.RabbitMQ安装 RabbitMQ Windows 安装、配置、使用 - 小白教程-腾讯云开发者社区-腾讯云下载erlang&#xff1a;http://www.erlang.org/downloads/https://cloud.tencent.com/developer/article/2192340 Windows 10安装RabbitMQ及延时消息插件rabbitmq_delayed_message_exch…

【Java项目】基于Spring Boot的校园博客系统

【Java项目】基于Spring Boot的校园博客系统 技术简介&#xff1a;采用Java技术、Spring Boot框架、MySQL数据库等实现。 系统简介&#xff1a;校园博客系统是一个典型的管理系统&#xff0c;主要功能包括管理员&#xff1a;首页、个人中心、博主管理、文章分类管理、文章信息…

【时时三省】(C语言基础)整型数据

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 整型数据 &#xff08;1&#xff09;基本整型&#xff08;int型&#xff09; 编译系统分配给int型数据2个字节或4个字节&#xff08;由具体的C编译系统自行决定&#xff09;。在存储单元中…