3.1 C/C++ 使用字符与指针
C/C++语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。C/C++语言具有很高的效率和控制能力,但也需要开发人员自行管理内存等底层资源,对于初学者来说可能会有一定的难度。
strtok 字符串切割: 将指定的一段字符串,根据指定的分隔符进行切割,切割后分别存入到新数组.
#include <stdio.h>int main(int argc, char* argv[])
{char str[] = "hello,lyshark,welcome";char *ptr;ptr = strtok(str, ",");while (ptr != NULL){printf("切割元素: %s\n", ptr);ptr = strtok(NULL, ",");}char str[] = "192.168.1.1";char *ptr;char *SubAddr[4] = {0};ptr = strtok(str, ".");for (int x = 0; x < 4; x++){SubAddr[x] = ptr;ptr = strtok(NULL, ".");}for (int x = 0; x < 4; x++)printf("%s \n", SubAddr[x]);system("pause");return 0;
}
strcpy 字符串拷贝: 将一个字符串数组中的数据拷贝到新的字符串空间中,拷贝知道遇到结束符为止.
#include <stdio.h>
#include <string.h>int main(int argc, char* argv[])
{char Array[] = "hello lyshark";char tmp[100];// 学习strcpy函数的使用方式if (strcpy(tmp, Array) == NULL)printf("从Array拷贝到tmp失败\n");elseprintf("拷贝后打印: %s\n", tmp);// 清空tmp数组的两种方式for (unsigned int x = 0; x < strlen(tmp); x++)tmp[x] = ' ';memset(tmp, 0, sizeof(tmp));// 学习strncpy函数的使用方式if (strncpy(tmp, Array, 3) == NULL)printf("从Array拷贝3个字符到tmp失败\n");elseprintf("拷贝后打印: %s\n", tmp);system("pause");return 0;
}
strcat 字符串连接: 将由src指向的字节串的副本,追加到由dest指向的以空字节终止的字节串的末尾.
#include <stdio.h>
#include <string.h>int main(int argc, char* argv[])
{char str1[50] = "hello ";char str2[50] = "lyshark!";char * str = strcat(str1, str2);printf("字符串连接: %s \n", str);str = strcat(str1, " world");printf("字符串连接: %s \n", str);str = strncat(str1, str2, 3);printf("字符串连接: %s \n", str);system("pause");return 0;
}
strcmp 字符串对比: 对比两个字符串是否一致,如果一致返回真否则返回假,此外如需要对比指定长度,可用strncmp()函数.
#include <stdio.h>
#include <string.h>int Str_Cmp(const char * lhs, const char * rhs)
{int ret = strcmp(lhs, rhs);if (ret == 0)return 1;elsereturn 0;
}int main(int argc, char* argv[])
{char *str1 = "hello lyshark";char *str2 = "hello lyshark";int ret = Str_Cmp(str1, str2);printf("字符串是否相等: %d \n", ret);if (!strncmp(str1, str2, 3))printf("两个字符串,前三位相等");system("pause");return 0;
}
strshr 字符串截取: 该函数主要实现从指定位置开始向后截取,直到遇到结束符停止输出.
#include <stdio.h>
#include <string.h>int main(int argc, char* argv[])
{const char buffer[32] = "hello lyshark welcome";const char needle[10] = "lyshark";const char* ret;ret = strstr(buffer, needle);printf("子字符串是: %s \n", ret);system("pause");return 0;
}
sprintf 格式化字符串: 该函数主要实现了对一段特定字符串进行格式化后并写入到新的缓冲区内.
#include <stdio.h>
#include <string.h>int main(int argc, char* argv[])
{// 格式化填充输出char buf[30] = { 0 };sprintf(buf, "hello %s %s", "lyshark","you are good");printf("格式化后: %s \n", buf);// 拼接字符串char *s1 = "hello";char *s2 = "lyshark";memset(buf, 0, 30);sprintf(buf, "%s --> %s", s1, s2);printf("格式化后: %s \n", buf);// 数字装换位字符串int number = 100;memset(buf, 0, 30);sprintf(buf, "%d", number);printf("格式化后: %s \n", buf);system("pause");return 0;
}
动态存储字符串: 首先分配二维指针并开辟空间,每次循环时开辟一维空间,并向其中写入字符串,最后循环输出.
#include <stdio.h>
#include <string.h>int main(int argc, char* argv[])
{// 分配空间char **p = malloc(sizeof(char *)* 5);for (int x = 0; x < 5;++x){p[x] = malloc(64); memset(p[x], 0, 64);sprintf(p[x], "Name %d", x + 1);}// 打印字符串for (int x = 0; x < 5; x++)printf("%s \n", p[x]);// 释放空间for (int x = 0; x < 5; x++){if (p[x] != NULL)free(p[x]);}system("pause");return 0;
}
实现字串长度统计: 字符串长度的计算原理时循环判断字符串是否遇到了\0并每次递增,遇到后直接返回.
#include <stdio.h>
#include <string.h>// 自己实现的一个字符串统计函数
int MyStrlen(char * String)
{int length = 0;// 写法一while (*String++ != '\0')length++;// 写法二//while (String[length] != '\0')// length++;return length;
}int main(int argc, char* argv[])
{char *StringA = "hello lyshark";char *StringB = "lyshark";char StringC[] = { 'l', 'y', 's', 'h', 'a', 'r', 'k','\0'};int string_len = strlen(StringA);printf("字符串长度: %d \n", string_len);int string_cmp = strlen(StringA) > strlen(StringB);printf("字符串大小比较: %d \n", string_cmp);int my_string_len = MyStrlen(StringC);printf("字符串长度: %d \n", my_string_len);system("pause");return 0;
}
实现字符串拷贝: 字符串拷贝函数其原理是将源地址中的数据依次复制到目标中.
#include <stdio.h>
#include <string.h>// 使用数组实现字符串拷贝
void CopyString(char *dest,const char *source)
{int len = strlen(source);for (int x = 0; x < len; x++){dest[x] = source[x];}dest[len] = '\0';
}// 使用指针的方式实现拷贝
void CopyStringPtr(char *dest, const char *source)
{while (*source != '\0'){*dest = *source;++dest, ++source;}*dest = '\0';
}
// 简易版字符串拷贝
void CopyStringPtrBase(char *dest, const char *source)
{while (*dest++ = *source++);
}int main(int argc, char* argv[])
{char * str = "hello lyshark";char buf[1024] = { 0 };CopyStringPtrBase(buf, str);printf("%s \n", buf);system("pause");return 0;
}
实现查找字符串: 查找字符串函数MyStrStr()实现了在指定字符串中寻找字串,找到后返回之后的数据.
#include <stdio.h>
#include <string.h>char * MyStrStr(char * dest, char *src)
{char * p = NULL;char * temp = src;while (*dest){p = dest;while (*dest == *temp && *dest){ dest++; temp++; }if (!*temp)return p;elsetemp = src;dest = p; dest++;}return NULL;
}int main(int argc, char* argv[])
{char *p = MyStrStr("hello lyshark", "shark");printf("找到子串: %s\n", p);system("pause");return 0;
}
实现字符串拼接: 自己实现字符串追加拼接,把String所指向的字符串追加到dest所指向的字符串的结尾.
#include <stdio.h>
#include <string.h>void MyStrCat(char * String, char * SubStr)
{ // 将指针移动到末尾while (*String != NULL)String++;// 开始拷贝while (*SubStr != NULL){*String = *SubStr;String++; SubStr++;}*String = '\0';
}int main(int argc, char* argv[])
{char String[100] = "hello";char * Sub = " lyshark";MyStrCat(String, Sub);printf("拼接字符串: %s\n", String);system("pause");return 0;
}
实现字符串去空格: 实现对字符串中空格的去除,循环判断原字符串是否有空格,如果有则跳过,没有则追加.
#include <stdio.h>
#include <string.h>char * RemoveSpace(char * String)
{char * start = String;char * end = String + strlen(String) - 1;while (*end == ' ' && end > start)end--;*(end + 1) = '\0';while (*start == ' ' && start < end)start++;return start;
}int main(int argc, char* argv[])
{char str[] = " hello lyshark ";char *ptr = RemoveSpace(str);printf("原字符串: %s 新字符串: %s \n", str,ptr);system("pause");return 0;
}
实现字符串逆序: 实现将指定的字符串逆序,其原理是将字符串首尾互换位置,循环更改原字符串.
#include <stdio.h>
#include <string.h>void Strswap(char *Array)
{int len = strlen(Array);char *p1 = Array;char *p2 = &Array[len - 1];while (p1 < p2){char tmp = *p1;*p1 = *p2;*p2 = tmp;p1++, p2--;}
}int main(int argc, char* argv[])
{char str[20] = "hello lyshark";Strswap(str);for (int x = 0; x < strlen(str); x++)printf("%c", str[x]);system("pause");return 0;
}
实现字符串截取: 实现在参数String所指向的字符串中搜索第一次出现字符ch的位置,并输出其后内容.
#include <stdio.h>
#include <string.h>char * MyStrchr(const char *String, char ch)
{char *ptr = String;while (*ptr != '\0'){if (*ptr == ch)return ptr;ptr++;}return NULL;
}int main(int argc, char* argv[])
{char Str[] = "hello lyshark";char ch = 's';char *ptr = MyStrchr(Str, ch);printf("输出结果: %s \n", ptr);system("pause");return 0;
}
字符串首字母排序: 实现传入一个指针数组,函数将根据字符串第一个字母进行排序,排序影响原数组.
#include <stdio.h>
#include <string.h>void bubble(char **Str, int len)
{for (int x = 0; x < len - 1; x++){for (int y = 0; y < len - x - 1; y++){if (**(Str + y) < **(Str + y + 1)){char * tmp = *(Str + y);*(Str + y) = *(Str + y + 1);*(Str + y + 1) = tmp;}}}
}int main(int argc, char* argv[])
{char *Str[] = { "csdfw", "qwesfae", "retyu", "wsf" };int len = sizeof(Str) / sizeof(char *);bubble(Str,len);for (int x = 0; x < len; x++)printf("%s \n", Str[x]);system("pause");return 0;
}
实现字符串的匹配: 该函数与strchr()类似,不过当StringMatch()函数匹配成功后会返回一个位置而不是字符串.
#include <stdio.h>
#include <string.h>int StringMatch(char *String, char *SubString)
{int x, y, start = 0;int str_len = strlen(String) - 1; // 得到主字符串长度int sub_len = strlen(SubString) - 1; // 得到子字符串长度int end_match = sub_len;for (y = 0; end_match <= str_len; end_match++, start++){if (String[end_match] == SubString[sub_len]){for (y = 0, x = start; y < sub_len && String[x] == SubString[y];)x++, y++;}if (y == sub_len)return (start + 1);}if (end_match > String)return -1;
}int main(int argc, char* argv[])
{char str[] = "hello lyshark welcome !";char sub[] = "lyshark";int ret = StringMatch(str, sub);if (ret != -1){printf("匹配到,字符间隔: %d \n", ret);}system("pause");return 0;
}
统计字符串字符个数: 实现循环一段字符串,每次取出一个字符并判断该字符是字母数组还是空格.
#include <stdio.h>
#include <string.h>void String_Count(char *String)
{int letter = 0, digit = 0, space = 0, other = 0;int len = strlen(String);for (int x = 0; x < len; x++){char ch = (char)String[x];if (ch != EOF){if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z')letter++;else if (ch >= '0' && ch <= '9')digit++;else if (ch == ' ')space++;elseother++;}}printf("字符: %d -> 数字: %d -> 空格: %d -> 其他: %d \n", letter, digit, space, other);
}int main(int argc, char* argv[])
{char *str = "hello lyshark !@#$ 123456";String_Count(str);char *str1 = "please input &*(123";String_Count(str1);system("pause");return 0;
}
指针实现字符串排序: 实现通过指针判断字符串位置,排序将按照A-Z的顺序进行.
#include <stdio.h>
#include <string.h>void String_Sort(char *String[],int len)
{char *temporary;int x, y;for (x = 0; x < len; x++){for (y = x + 1; y < len; y++){if (strcmp(String[x], String[y]) > 0){temporary = String[x];String[x] = String[y];String[y] = temporary;}}}
}int main(int argc, char* argv[])
{char *str[] = { "CPP", "Basic", "LyShark", "Hello", "Great" };char **ptr = str;String_Sort(str, 5);for (int x = 0; x < 5; x++)printf("%s \n", str[x]);system("pause");return 0;
}
实现字符串替换: 实现将string缓冲区里面的字符串{}符号,替换为%d字符.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>int ReplaceStr(char* sSrc, char* sMatchStr, char* sReplaceStr)
{int StringLen;char caNewString[64];char* FindPos;FindPos = (char *)strstr(sSrc, sMatchStr);if ((!FindPos) || (!sMatchStr))return -1;while (FindPos){memset(caNewString, 0, sizeof(caNewString));StringLen = FindPos - sSrc;strncpy(caNewString, sSrc, StringLen);strcat(caNewString, sReplaceStr);strcat(caNewString, FindPos + strlen(sMatchStr));strcpy(sSrc, caNewString);FindPos = (char *)strstr(sSrc, sMatchStr);}free(FindPos);return 0;
}int main(int argc, char **argv)
{char string[] = "192.168.1.{}";BOOL ret = ReplaceStr(string, "{}", "%d");if (ret == 0)printf("%s \n", string);system("pause");return 0;
}
本文作者: 王瑞
本文链接: https://www.lyshark.com/post/a11c68a9.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
相关文章:
3.1 C/C++ 使用字符与指针
C/C语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。…...
[代码学习]einsum详解
einsum详解 该函数用于对一组输入 Tensor 进行 Einstein 求和,该函数目前仅适用于paddle的动态图。 Einstein 求和是一种采用 Einstein 标记法描述的 Tensor 求和,输入单个或多个 Tensor,输出单个 Tensor。 paddle.einsum(equation, *opera…...
女性必看——“黄体破裂”到底有多可怕?
前几天的亚运会上发生了这样一件事: 雅思敏(化名)是一名国外皮划艇运动员,在亚运会上奋力完成皮划艇比赛后,突然开始 剧烈腹痛、面色苍白,大汗淋漓,经过进一步检查,确诊卵巢黄体破裂…...
colab切换目录的解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...
基于SSM的生活缴费系统的设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…...
【WebLogic】WebLogic 2023年7月补丁导致JVM崩溃的解决方案
受影响版本: Oracle WebLogic 12c(12.2.1.4.0)Oracle WebLogic 14c(14.1.1.0.0) 问题描述: Oracle官方在2023年7月发布的最新版本的OPatch(13.9.4.2.13)存在一个新出现的Bug&#…...
简单OpenSL ES学习
初识OpenSL ES OpenSL ESObjects和Interfaces 所有的Object在OpenSl里面我们拿到的都是一个SLObjectItf:SLObjectItf_创建引擎创建过程要设计得这么麻烦?(object的生命周期)这么多参数,参数类型这么多学习障碍太大&…...
Linux网络编程- struct packet_mreq setsockopt()
struct packet_mreq struct packet_mreq 是一个数据结构,用于 Linux 中的原始数据包套接字,当我们想改变套接字的行为以接收特定类型的数据包时,它与 setsockopt() 函数配合使用。 下面是 struct packet_mreq 的定义: struct p…...
C++学习day4
作业: 1> 思维导图 2> 整理代码 1. 拷贝赋值函数课上代码 //拷贝赋值函数课上代码 #include<iostream> using namespace std;//创建类 class Stu { private://私有的string name;int socer;int *age;//此处注意用到指针类型 public://共有的//无参构…...
从零学算法54
54.给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 螺旋遍历:从左上角开始,按照 向右、向下、向左、向上 的顺序 依次 提取元素,然后再进入内部一层重复相同的步骤,直到…...
Logback日志框架使用详解以及如何Springboot快速集成
Logback简介 日志系统是用于记录程序的运行过程中产生的运行信息、异常信息等,一般有8个级别,从低到高为All < Trace < Debug < Info < Warn < Error < Fatal < OFF off 最高等级,用于关闭所有日志记录fatal 指出每个…...
Nginx概念
Nginx概念 Nginx 是一款面向性能设计的 HTTP 服务器,相较于 Apache、lighttpd 具有占有内存少,稳定性高等优势,同时也是一个非常高效的反向代理、负载平衡服务器 nginx使用的是反应器模式,主事件循环等待操作系统发出准备事件的信…...
vim基础指令(自用)
这个是自己随便写的,类似于笔记 vim 多模式编辑器 查看指令: gg: 定位光标到最开始行 shift(按)g 定位到最结尾行 nshift(按)g 定位到任意行 shift$ 定位到本行结尾 0 定位到本行开头 w:跨单词移动 h.j.k,l: 左下上右 …...
【centos7安装ElasticSearch】
概述 最近工作中有用到ES ,当然少不了自己装一个服务器捣鼓。本文的ElasticSearch 的版本: 7.17.3 一、下载 ElasticSearch 点此下载 下载完成后上传至 Linux 服务器,本文演示放在: /root/ 下,进行解压࿱…...
ElementPlus Switch 开关基础使用
昨天开发用到开关组件 后台返回字段是 can_write 默认是0 or 1 但是Switch 组件绑定的默认值默认是 true or false 直接绑定会导致默认是关闭状态 在页面一加载 值发生变化时 会自己调用 查了文档 需要使用 active-value 和 inactive-value 来指定绑定的数据类型 …...
Spring Boot:自定义注解--annotation
目录 自定义注解的定义和作用范围如何创建自定义注解创建注解接口 如何使用自定义注解进行数据验证创建注解处理器控制器中使用注解 如何为字段添加注解 自定义注解的定义和作用范围 自定义注解可以作用在类、方法、属性、参数、异常、字段或其他注解上。 如何创建自定义注解…...
WIFI频段
问题: 5ghzwifi频段带宽怎么选 智造喵回答: 选择5GHz WiFi频段的带宽取决于你的网络需求和设备兼容性。通常有两种可选的带宽:20MHz和40MHz。 20MHz带宽:这是较为常见的 WiFi 频段带宽设置。它提供较好的穿墙能力和信号稳定性…...
Java的引用详解与示例
引用的作用 在Java中,引用(Reference)是一种重要的概念,它们用于管理对象的生命周期、内存分配和垃圾回收。引用的作用包括以下几个方面: 内存管理:引用帮助Java虚拟机(JVM)管理内存…...
c++视觉处理---霍夫变换
霍夫直线变换的函数 HoughLines 是OpenCV库中用于执行霍夫直线变换的函数。霍夫直线变换用于检测图像中的直线。下面是该函数的基本用法: cv::HoughLines(image, lines, rho, theta, threshold);image: 输入的二值图像,通常是通过边缘检测算法生成的。…...
el-table 边框颜色修改 简单有效!
废话不多说,直接上图 (1)修改前的图如下: 以上是elementUI原组件自带的样式 (2)下面是修改后的边框图如下: 源码如下: <el-table :data"jctableData" border size…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...
