C_09_字符操作

news2024/9/27 15:28:38

字符串相关函数

头文件都是 string.h

概述:

由系统提供的由字符串处理的函数

属于库函数

所属头文件

string.h

1 strlen

测量字符串长度

语法:

size_t strlen(const char *s);
   参数:
       	要测量的字符串
       返回值:
       		长度
       注意:
   			测量的长度不包括\0
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
     char *str = "hello6\0";
     int len = strlen(str);
     printf("str len = %d\n", len); // 结果不包含\0 因为\0 本身是0

     char str02[100] = {0};
     printf("请输入内容:");
     fgets(str02, 100, stdin);

     int len2 = strlen(str02);
     printf("len2 = %d\n", len2);
     // 为什么会输入 长度  为5  因为 你敲击回车 代表\n换行了  也算一个字符
     return 0;
}

在这里插入图片描述

为什么会输入root 明明只有4长度 但是为什么显示长度 为5 因为 你敲击回车 代表\n换行了 也算一个字符

2 strcpy:

拷贝字符串(深拷贝)

char *strcpy(char *dest, const char *src);
		参数:
			dest:目标位置
			src:资源位置
		返回值:
			就是目标位置	
             作用:将src的内容赋值给dest
char *strncpy(char *dest, const char *src, size_t n);
		参数:
			dest:目标位置
			src:资源位置
			n:拷贝的字节数
		返回值:
			就是目标位置
			作用:将src前n个字节的内容赋值给dest
浅拷贝 : 拷贝的是地址
          如 :
 // char *str01 = "abc";//此时abc在常量区,str01 指向常量区,此时不能对其值进行修改 char str01[] = "abc"; // 将常量区的abc拷贝到str01所在的栈的区域
          char *str02 = str01;                     // 此时产生浅拷贝,只拷贝了str01的地址,并没有拷贝其值, 那么此时str01与str02指向同一位置
         str01[0] = 'A'; // 当str01被修改后,str02打印的内容也将被修改
         printf("str01 = %s\n", str01);
         printf("str02 = %s\n", str02);//深拷贝 : 拷贝的是内容:
             char str01[] = "abc";
             char *str02 = (char *)malloc(100);
             memset(str02, 0, 100);
             strcpy(str02, str01); // 使用strcpy函数对字符串拷贝为深拷贝,将str01的内容拷贝到str02中, 此时str01与str02指向的地址不同
             str01[0] = 'A'; // 修改str01中的内容,并不会影响str02中的内容
             printf("str01 = %s\n", str01);
             printf("str02 = %s\n", str02);

3 strcat:

追加

语法:

char *strcat(char *dest, const char *src);
参数:
		dest:目标位置
      src:资源位置
   作用:将src的内容追加到dest的尾部
char *strncat(char *dest, const char *src, size_t n);
		参数:
			dest:目标位置
			src:资源位置
			n:追加的字节数
      作用:将src的内容的前n个字节追加到dest的尾部

注意:

使用该函数需注意目标位置指向的内存大小要足够

4 strcmp

比较字符串内容是否相同

时刻注意字符串尾部的 \0

语法:

int strcmp(const char *s1, const char *s2);
参数:
	s1: 字符串1
	s2: 字符串2
返回值:
0 表示相同  非0 表示不同

因为  比较的原理就是  相减   要是为0 就表示一致
  不为0 表示不一致       

示例:

判断 账号与密码是否正确

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
     // 输入账号密码,判断登录是否成功注册时账号:root,密码:123456
     printf("请输入账号:\n");                 // 提示输入账号
     char *username = (char *)calloc(100, 1); // calloc(每块内存大小,几块)
     fgets(username, 99, stdin);
     int len1 = strlen(username); // 求出 username的字符串长度
     // 关键一步:  去掉 尾部 '\0'
     username[len1 - 1] = '\0';

    printf("请输入密码:\n");
     char *password = (char *)malloc(100); // malloc(申请开辟的内存大小)
     // 因为  malloc 生成的内存存放的是随机的 而calloc申请的内存存放的是0
     memset(password, 0, 100);
     fgets(password, 99, stdin); // 因为字符以\n 换行结束
     int len2 = strlen(password);
     password[len2 - 1] = '\0';
 
    int x = strcmp(username, "admin");
     int y = strcmp(password, "123456");
 
    printf("%d\n", x); // 比较结果
     printf("%d\n", y);
     if (x == 0 && y == 0)
     {
         printf("登录成功\n");
       }
     else
     {
         printf("登录失败\n");
       }
     return 0;
 }

在这里插入图片描述

要是不将 尾部 \0 去掉 会怎么样:

在这里插入图片描述

5 strchr

查询单个字符首次出现的位置

语法:

char *strchr(const char *s, int c);
作用:
		在s中查询 c第一次出现的位置

 参数:
			s:被查找的字符串
			c:要查找的字符
  返回值:
			c第一次出现的位置的地址
			如果c不存在则返回NULL

char *strrchr(const char *s, int c);    // 从右侧往左侧数

示例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
   // 输入一个字符串输出其长度,查询其指定字符 a 第一次出现的位置 与 最后一次出现的位置
   printf("请输入内容:\n");
   char *str = (char *)malloc(100);
   int len = strlen(str);
   if (str != NULL)
   {
        memset(str, 0, 100);
        fgets(str, 99, stdin); // 获取输入的内容
        // char *strchr(const char *s, int c); s:被查找的字符串 c:要查找的字符    返回值:c第一次出现的位置的地址 如果c不存在则返回NULL
        char *p = strchr(str, 'a');
        printf("首次位置==%p\n", &p); // 首次位置
        char *p1 = strrchr(str, 'a');
        printf("最后一次位置=%p\n", &p1); // 最后一次位置
   }
   free(str); // 释放内存
   return 0;
}

6 strstr

查找指定字符串出现的位置

语法:

char *strstr(const char *haystack, const char *needle);
参数:
	haystack:被查找的字符串
	needle:要查找的字符串
返回值:
		查找到的字符串第一次出现的位置
		如果不存在返回NULL

7 atoX:

转数字

int atoi(const char * p);
	将字符串型的整数,转换为int
double atof(const char * p);
	将字符串型的浮点数,转换为double

示例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
       // 键盘输入两个整型字符串,计算两个输入的数之和
       //  考核:转 数字
       // 使用 fgets 从标准输入读取字符串时,包括换行符 \n 也会被读取。因此,在使用 atoi 转换之前,应该去除字符串末尾的换行符。
       char *arr1 = (char *)calloc(60, 1); // 申请内存
       printf("请输入内容1:");
       fgets(arr1, 60, stdin); // 获取用户输入
       char *arr2 = (char *)calloc(60, 1);
       int len1 = strlen(arr1);
       // 去除 \0
       arr1[len1 - 1] = '\0';
       printf("请输入内容1:");
       fgets(arr2, 60, stdin);
       int len2 = strlen(arr2);
       // 去除 \0
       arr2[len2 - 1] = '\0';
       int x = atoi(arr1);
       int y = atoi(arr2);
       int z = x + y;
       printf("总和为:%d\n", z);
       return 0;
}

8 strtok():

切割字符串内容

注意点: 首次切割 和 余下后面的切割 切割的内容不一样

首次 是以整个数组切割

余下切割都是以上一次切割后剩余部分继续切割

语法:

char *strtok(char *str, const char *delim);
参数:
		str:被切割的字符串
		delim:以什么切割
返回值:
		切割后的字符串

注意:

每调用一次该函数,切割一次
切割上一次剩余的字符串时str填NULL

示例1:

void method07()
{
			char str[] = "hehehe:::::::::hahaha#xixixi@lalala:heiheihei";
			char tag[] = ":#@";
			char *p = strtok(str,tag);   // 首次切割
			printf("str = %s\n",str);
			printf("p = %s\n",p);
			//当被切割的字符串为NULL,将会切割上一次剩余的字符串
			char *p2 = strtok(NULL,tag);  // 余下切割 是以上一次剩余的部分进行的
			printf("p2 = %s\n",p2);
}

示例2:

#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
    // 1 定义数组来接收 原始数据
    char str[] = "hehehe:::::::::hahaha#xixixi@lalala:heiheihei";
    // 2 定义切割标准数组
    char tag[] = ":#@";
    // 3 定义来存储 切割后的字符段
    char *strs[6] = {str}; // 初始化strs[0]为str的地址
    int len = 0;
    ;          // 定义切割完的段数
    int i = 0; // 定义切割的位置从0开始
    while ((strs[i] = strtok(strs[i], tag)) != NULL && ++i && ++len)
        ;

    printf("切割完的段数= %d\n", len);
    for (int i = 0; i < len; i++)
    {
        printf("%s\n", strs[i]);
    }
    return 0;
}

格式化字符串

概述:

在这里插入图片描述

1 组包

sprintf

int sprintf(char *str, const char *format,...);
		作用:
//给str指向的内存中写入指定内容,format格式化字符串,....替换掉占位符的值。 

2 解包

0sscanf

int sscanf(const char *str, const char *format, ...);
作用:
		从str中按format获取数据到...

注意

正则表达式

%d:只能取整数
%c:一次读取一个字符
%s:与空格,换行,\0读取结束
%2d:取两位整数,如果超过2位取两位,不足两位有几位取几位
%*d:跳过整数
%*2d:跳过两位整数
%[a-z] 表示匹配 a 到 z 中任意字符(尽可能多的提取,遇除a-z以外结束)
贪婪性:尽可能多的提取
%[aBc]  匹配 a、B、c 中一员,贪婪性 
%[^aFc] 匹配非 a Fc 的任意字符,贪婪性,遇a,F,c结束
%[^a-z] 表示读取除 a-z 以外的所有字符  遇到小写字母就结束

示例

char buf[20];
sscanf("x@1000phone.com","%*[^@]@%[^.]",buf);
printf("%s\n",buf);
//  结果  1000phone       

%d:只能取整数

%c:一次读取一个字符
%s:与空格,换行,\0读取结束
%2d:取两位整数,如果超过2位取两位,不足两位有几位取几位
%*d:跳过整数
%*2d:跳过两位整数
%[a-z] 表示匹配 a 到 z 中任意字符(尽可能多的提取,遇除a-z以外结束)
贪婪性:尽可能多的提取
%[aBc] 匹配 a、B、c 中一员,贪婪性
%[^aFc] 匹配非 a Fc 的任意字符,贪婪性,遇a,F,c结束
%[^a-z] 表示读取除 a-z 以外的所有字符 遇到小写字母就结束


示例

~~~c
char buf[20];
sscanf("x@1000phone.com","%*[^@]@%[^.]",buf);
printf("%s\n",buf);
//  结果  1000phone       

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

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

相关文章

Screenshot Software,截屏软件

一.截屏软件 1.1 自带的一些截屏软件 &#xff08;1&#xff09;微信 &#xff08;2&#xff09;QQ 有一次无意中测试了下&#xff0c;截屏软件的截屏质量&#xff0c;发现对于同一个页面截全屏&#xff0c;微信截的屏质量相对于 win 自带的截图软件还要好的&#xff0c;所以…

Elasticsearch 开放推理 API 增加了对 Anthropic 的 Claude 的支持

作者&#xff1a;来自 Elastic Jonathan Buttner 我们很高兴地宣布 Elasticsearch Open Inference API 的最新功能&#xff1a;集成 Anthropic 的 Claude。这项功能使 Elastic 用户能够直接连接到 Anthropic 平台&#xff0c;并使用 Claude 3.5 Sonnet 等大型语言模型来构建 Ge…

Java 应用服务器有哪些?

应用服务器 Java 应用服务器是专门用来运行基于Java技术的Web应用程序的服务器。 这些服务器支持Java EE&#xff08;Java Platform, Enterprise Edition&#xff09;规范&#xff0c;提供了多种服务&#xff0c;如事务管理、Java Naming and Directory Interface (JNDI)、数…

机器之心 | 五倍吞吐量,性能全面包围Transformer:新架构Mamba引爆AI圈

本文来源公众号“机器之心”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;五倍吞吐量&#xff0c;性能全面包围Transformer&#xff1a;新架构Mamba引爆AI圈 屹立不倒的 Transformer 迎来了一个强劲竞争者。 在别的领域&#xff…

探索 HarmonyOS NEXT Developer Beta6,开启创新应用

华为的鸿蒙 NEXT 的发展越来越快 HarmonyOS NEXT Developer Beta6 版本的推出&#xff0c;为开发者们带来了全新的机遇和挑战。这个版本不仅拥有诸多令人振奋的新特性&#xff0c;还提供了丰富的新增资源和精彩的开发者活动。 新特性方面&#xff0c;DevEco Studio NEXT Dev…

算法练习题06:leetcode793每日温度

单调栈解法 class Solution {public int[] dailyTemperatures(int[] temperatures) {int length temperatures.length;int[] ans new int[length];Stack<Integer> stack new Stack<>();for(int i 0;i<length;i){int temperature temperatures[i];while(!…

系统功能性能优化:从问题定位到解决方案的系统性分析

引言 在现代软件系统中&#xff0c;性能优化是确保系统稳定、响应迅速和资源高效利用的关键。面对复杂的系统架构和业务逻辑&#xff0c;进行性能优化往往需要遵循一系列系统性的步骤&#xff0c;以确保问题被准确识别&#xff0c;解决方案被有效实施。以下是一套专业的系统功…

Linux下的使用字符设备驱动框架编写ADC驱动 ——MQ-4传感器

ADC的原理 ADC 的作用&#xff1a;模拟信号转换为数字信号 模拟信号一般是指连续变化的电压信号&#xff0c;其数值在一定范围内变化。 而数字信号是由一系列离散的数字表示&#xff0c; 只能取有限的值&#xff0c;通常以二进制形式表示。 ADC通常由一个采样保持电路、一个…

C++(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例2

C(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例2 文章目录 C(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例21、概述2、实现效果3、主要代码4、源码地址 更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;GIS开发 &#x1f448; 1、概述 支持多线程…

Android 事件分发:为什么有时候会出现事件冲突?事件的顺序是如何的?出现事件冲突如何解决呢?比如为什么左右可以滑动,而上下却不行?

目录&#xff1a; 一、为什么要学习事件呢&#xff1f; 1.在开发复杂的应用时&#xff0c;经常需要处理复杂的用户交互逻辑。学习事件分发机制可以帮助你更好地控制事件的传递和处理流程&#xff0c;从而解决一些复杂的交互问题&#xff0c;如滑动冲突、点击穿透等。 2.面试需…

NLP笔记:BLEU

1 介绍 bleu是一种文本评估算法&#xff0c;它是用来评估机器翻译跟专业人工翻译之间的对应关系核心思想就是机器翻译越接近专业人工翻译&#xff0c;质量就越好&#xff0c;经过bleu算法得出的分数可以作为机器翻译质量的一个指标 2 BLEU原理 2.1 N-gram BLEU采用了N-gram…

NLP(三):词向量

自然语言处理&#xff0c;处理的是自然的需要&#xff0c;通过分词后得到我们想要的词&#xff0c;但是不可能直接把这种自然语言传递给计算机来理解。这时候就有一个概念叫词向量&#xff0c;用来表示词的特征向量或表征。 一&#xff0c;词向量的表示 词向量的表示主要有两…

C——四种排序方法

这一篇文章我将要详细讲解四种排序方法 1.冒泡排序 冒泡排序是我们首先接触的排序方法&#xff0c;他通过两次循环完成。 /*冒泡排序*/&#xff08;升序&#xff09; void maopao(int *a,int n) {int i;for(i 0; i < n-1; i){for (int j 0; j < n - 1 - i; j){if (a[…

mars3D使用 POI 查询、限定范围

mars3D使用 一、mars3D中使用 geocoder 进行 POI 查询二、限定范围1.初始化时渲染2.重新渲染 总结 一、mars3D中使用 geocoder 进行 POI 查询 在json文件或者自己的mapOptions中配置token "token":{"tianditu":"e5c3984ced09bc1f55e8e1107fdc5a6b&q…

论文速览【LLM-agent】—— 【ReAct】Synergizing Reasoning and Acting in Language Models

文章链接&#xff1a;ReAct: Synergizing Reasoning and Acting in Language Models发表&#xff1a;ICLR 2023领域&#xff1a;LLM agent 摘要&#xff1a;尽管大型语言模型&#xff08;LLMs&#xff09;在语言理解和交互式决策任务中展示了令人印象深刻的能力&#xff0c;但它…

正弦波振荡器工作原理及频率稳定性条件

晶发电子专注17年晶振生产,晶振产品包括石英晶体谐振器、振荡器、贴片晶振、32.768Khz时钟晶振、有源晶振、无源晶振等&#xff0c;产品性能稳定,品质过硬,价格好,交期快.国产晶振品牌您值得信赖的晶振供应商。 正弦波振荡器是一种能够自动将直流电转换为特定频率和振幅的正弦交…

解析云原生架构中两大核心原则

1.云原生架构是什么 云原生架构是一种设计和构建应用程序的现代方法&#xff0c;以微服务、容器化、持续集成和持续部署&#xff08;CI/CD&#xff09;等技术为基础&#xff0c;使应用能够在云环境中动态运行。云原生架构强调解耦合、弹性和自动化&#xff0c;开发团队在独立的…

【高级编程】万字整理集合框架 迭代器 泛型(含方法案例)

文章目录 集合框架集合接口集合类ArrayListLinkedListHashSet 迭代器 IteratorMap 接口泛型Collections 工具类 集合框架 如果并不知道程序运行时会需要多少对象&#xff0c;或者需要更复杂方式存储对象——可以使用Java集合框架 Java集合框架提供了一套性能优良、使用方便的…

@EqualsAndHashCode注解使用

一&#xff0c;EqualsAndHashCode注解来自于Lombok EqualsAndHashCode 是 Lombok 库提供的一个注解&#xff0c;用于自动生成 equals 和 hashCode 方法。这两个方法在 Java 中非常重要&#xff0c;特别是在集合框架中使用时&#xff0c;它们确保了对象的正确比较和哈希值的一致…

YOLOv8改进 | 注意力篇 | YOLOv8引入LSK注意力机制

1. LSK介绍 1.1 摘要: 最近关于遥感目标检测的研究主要集中在改进定向边界框的表示上,但忽略了遥感场景中呈现的独特先验知识。 这种先验知识可能很有用,因为在没有参考足够远距离上下文的情况下,可能会错误地检测微小的遥感物体,并且不同类型物体所需的远距离上下文可能…