C_字符串的一些函数
1.字符串输入函数
scanf("%s",数组名);
gets(数组名);
区别:
scanf(“%s”,数组名); 把空格识别为输入结束
#include <stdio.h>int main()
{char a[10];printf("输入:");scanf("%s",a);//gets(a);printf("输出:%s\n",a);return 0;
}
![]()
gets(数组名); 可以识别空格字符到数组中
#include <stdio.h>int main()
{char a[10];printf("输入:");//scanf("%s",a);gets(a);printf("输出:%s\n",a);return 0;
}
![]()
2.字符串输出函数
printf(“xxxx%s”,数组名);
puts(数组名);
区别:
printf可以放描述语
puts函数自动加换行符
3.计算字符串有效长度函数
计算字符串长度可以使用标准库中的 strlen 函数。这个函数位于 <string.h> 头文件中。
#include <stdio.h>
#include <string.h>int main()
{char str[] = "Hello, World!";size_t length = strlen(str); // 计算字符串长度printf("Length of the string is: %zu\n", length);return 0;
}
sizeof 和 strlen 的区别?
sizeof:
属性 :是一个关键字
使用格式: int val = sizeof(变量名); 可以用于变量,数组
功能 :计算占用字节空间大小的
strlen:
属性 :是一个函数
使用格式: int val = strlen(数组名) ;只能用于数组(字符串)
功能 :计算字符串的有效长度
练习1:
char a[10] = “qwert”;
sizeof(a) //10byte
strlen(a) //5
练习2:
char a[] = “qwert”;
sizeof(a) //6byte
strlen(a) //5
练习:自己写一个。
要求:
用户在主函数中输入一个字符串,
写一个子函数,子函数功能是接到主函数的字符串计算长度,并且返回具体长度值.
主函数调用子函数通过接收返回值来打印字符串的长度.
#include <stdio.h>int my_strlen(char *str);int main()
{char a[20];int len;printf("请输入一个字符串:\n");scanf("%s",a);len = my_strlen(a);printf("输入的字符串的长度为:%d",len);return 0;
}/*******************************************************
函数名 :my_strlen
函数功能 :计数字符串的有效长度
函数参数 :char *str
函数返回值 :int
函数描述 :
*******************************************************/
int my_strlen(char *str)
{int cont = 0;int i = 0;while(*(str+i) != '\0'){cont++;i++;}return cont;
}
4.字符串复制函数
复制字符串可以使用标准库中的 strcpy 函数。这个函数位于 <string.h> 头文件中。
#include <stdio.h>
#include <string.h>int main() {char src[] = "Hello, World!";char dest[50]; // 确保目标数组足够大strcpy(dest, src); // 复制字符串printf("Source String: %s\n", src);printf("Destination String: %s\n", dest);return 0;
}
练习:自己写一个。
要求:
用户输入两个字符串str1 和 str2
要求写一个子函数将str2复制给str1
打印复制后的str1
char str1[] = “123456”;
char str2[] = “abcdef“;
复制后:str1 : “abcdef“
#include <stdio.h>void my_strcpy(char *dest,char *src);int main()
{char str1[50],str2[50];printf("请输入str1:");scanf("%s",str1);printf("请输入str2:");scanf("%s",str2);my_strcpy(str1,str2);printf("复制后的str1:%s",str1);return 0;
}/*******************************************************
函数名 :my_strcpy
函数功能 :复制字符串
函数参数 :char *dest char *src
函数返回值 :无
函数描述 :函数会将字符串src复制给dest
*******************************************************/
void my_strcpy(char *dest,char *src)
{int i = 0;while(*(src+i) != '\0'){*(dest+i) = *(src+i);i++;}*(dest+i) = '\0'; //这句非常重要,否则当str1和str2长度不一致时会出现bug
}
假如没有加这一句:
*(dest+i) = '\0';
当str2长, str1短, 复制后str1会出现乱码,因为结束字符被覆盖了;(有些编译器在执行时会优化,不会出现乱码)
当str1长, str2短, 复制后str1会没有完全被覆盖;
可以注释掉这一句看看会发生什么。
5.字符串拼接函数
字符串拼接可以使用标准库中的 strcat 函数。这个函数位于 <string.h> 头文件中。
#include <stdio.h>
#include <string.h>int main() {char dest[50] = "Hello, "; // 目标字符串,留出足够空间char src[] = "World!";// 使用 strcat 函数拼接字符串strcat(dest, src);printf("Concatenated String: %s\n", dest);return 0;
}
练习:自己写一个。
要求:
用户主函数中输入两个字符串str1和str2
写一个子函数实现将str2拼接到str1后面
str1:1234
str2:abcd
拼接后:str1:1234abcd
#include <stdio.h>void my_strcat(char *dest,char *src);int main()
{char str1[50],str2[50];printf("请输入str1:");scanf("%s",str1);printf("请输入str2:");scanf("%s",str2);my_strcat(str1,str2);printf("拼接后的str1:%s",str1);return 0;
}/*******************************************************
函数名 :my_strcat
函数功能 :拼接字符串
函数参数 :char *dest char *src
函数返回值 :无
函数描述 :函数会将字符串src拼接在dest后
*******************************************************/
void my_strcat(char *dest,char *src)
{int i = 0,j = 0;while(*(dest+i) != '\0'){i++;}while(*(src+j) != '\0'){*(dest+i) = *(src+j);i++;j++;}*(dest+i) = '\0';
}
6.字符串比较函数
字符串比较可以使用标准库中的 strcmp 函数。这个函数位于 <string.h> 头文件中。
#include <stdio.h>
#include <string.h>int main() {char str1[50], str2[50];printf("请输入第一个字符串: ");scanf("%s", str1);printf("请输入第二个字符串: ");scanf("%s", str2);int result = strcmp(str1, str2);if (result == 0) {printf("两个字符串相同。\n");} else if (result < 0) {printf("第一个字符串小于第二个字符串。\n");} else {printf("第一个字符串大于第二个字符串。\n");}return 0;
}
(库函数是从头开始逐个比较,只要出现不同的字符就立马返回结果)
练习:自己写一个。
要求:
用户在主函数输入两个字符串,str1和str2,
在子函数中判断连个字符串是否相等,(长度要相等,对应字符一样)
相等返回0,不相等返回1;
(和库函数不太一样)
#include <stdio.h>int my_strcmp(char *str1,char *str2);int main()
{char str1[50],str2[50];int judge;printf("请输入str1:");scanf("%s",str1);printf("请输入str2:");scanf("%s",str2);judge = my_strcmp(str1,str2);if(judge == 0){printf("字符串str1和字符串str2相同。");}else if(judge == 1){printf("字符串str1和字符串str2不相同。");}return 0;
}/*******************************************************
函数名 :my_strcmp
函数功能 :比较字符串
函数参数 :char *str1 char *str2
函数返回值 :int
函数描述 :比较字符串str1和字符串str2,如果相同则返回0,不相同则返回1.(长度和内容都相同)
*******************************************************/
int my_strcmp(char *str1, char *str2)
{// 定义循环索引变量int i = 0, j = 0, k = 0;// 遍历第一个字符串,找到结束符'\0'的位置while (*(str1 + i) != '\0'){i++; // 递增索引}// 遍历第二个字符串,找到结束符'\0'的位置while (*(str2 + j) != '\0'){j++; // 递增索引}// 如果两个字符串的长度相同if (i == j){// 比较两个字符串的每一个字符while (*(str1 + k) != '\0'){// 如果某一位置的字符不同,返回1表示不相同if (*(str1 + k) != *(str2 + k)){return 1; // 字符不同,返回1}k++; // 继续比较下一个字符}return 0; // 所有字符都相同,返回0}else // 如果两个字符串的长度不同{return 1; // 长度不同,返回1}
}
也可以这样写,这样比较像库函数的写法。
#include <stdio.h>int my_strcmp(char *str1, char *str2);int main()
{char str1[50], str2[50];int judge;printf("请输入str1: ");scanf("%s", str1);printf("请输入str2: ");scanf("%s", str2);judge = my_strcmp(str1, str2);if(judge == 0){printf("字符串str1和字符串str2相同。\n");}else{printf("字符串str1和字符串str2不相同。\n");}return 0;
}/*******************************************************
函数名 : my_strcmp
函数功能 : 比较字符串
函数参数 : char *str1, char *str2
函数返回值 : int
函数描述 : 比较字符串str1和字符串str2,如果相同则返回0,不相同则返回1。(长度和内容都相同)
*******************************************************/
int my_strcmp(char *str1, char *str2)
{while (*str1 != '\0' && *str2 != '\0') // 同时遍历两个字符串{if (*str1 != *str2) // 如果字符不相同,返回1{return 1;}str1++;str2++;}// 如果两个字符串长度不同,直接返回1if (*str1 != *str2){return 1;}// 如果完全遍历过后两个字符串都相同,返回0return 0;
}
这是库函数的写法:
int my_strcmp( char *str1, char *str2) {
while (*str1 != '\0' && *str2 != '\0') {
if (*str1 != *str2) {
return *str1 - *str2; // 返回字符差值
}
str1++;
str2++;
}
// 如果字符串都已结束,则比较长度
return *str1 - *str2;
}
一些小题目练练手
1.编写程序,将用户输入的字符串中的所有的字符a用*代替,然后输出。
分析:
通过循环结构遍历每个字符并且判断是否为子符a,
如果是字符a,用*字符替换此元素
循环的条件 用户输入的字符串不是'\0'
2.输入一串字符,把其中的大写字母变成小写字母并输出
分析:
用户输入一个字符串,
通过循环结构遍历每个字符,
判断如果某个字符是大写的就把此元素替换为对应的字符小写
循环条件是 '\0'
3.写一函数判断一字符串是否为回文,是返回1,不是返回0,
"123321"
"12321"
"asdffdsa"
"asdfdsa"
分析:
用第一个 与最后一个比较 ,以此类推, 如果出现不相等的就不是回文
循环结构正常结束,就是回文。
1.
#include <stdio.h>int main()
{char a[100];int i = 0;printf("请输入字符串:");scanf("%s",a);while(a[i] != '\0'){if(a[i] == 'a'){a[i] = '*';}i++;}printf("已经将所以'a'替换成了‘*’\n替换后的字符串为:%s",a);return 0;
}
2.
#include <stdio.h>int main()
{char a[100];int i = 0;printf("请输入字符串:");scanf("%s",a);while(a[i] != '\0'){if(a[i] >= 'A'&& a[i] <='Z'){a[i] += 32;}i++;}printf("已经将所以大写字母替换成对应的小写字母\n替换后的字符串为:%s",a);return 0;
}
3.
#include <stdio.h>
#include <string.h>int pal(char *str);int main()
{char a[100];int judge;printf("请输入字符串:");scanf("%s",a);judge = pal(a);if(judge == 1){printf("是回文");}else if(judge == 0){printf("不是回文");}return 0;
}int pal(char *str){int len = strlen(str);for(int i = 0 ;i < len/2;i++){if(*(str+i) != *(str+len-1-i)){return 0;}}return 1;}
相关文章:
C_字符串的一些函数
1.字符串输入函数 scanf("%s",数组名); gets(数组名); 区别: scanf(“%s”,数组名); 把空格识别为输入结束 #include <stdio.h>int main() {char a[10];printf("输入:");scanf("%s",a)…...
使用Native AOT发布C# dll 提供给C++调用
Native AOT,即提前本地编译(Ahead-Of-Time Compilation),是一种将托管代码(如 C#)编译为本机可执行文件的技术,无需在运行时进行任何代码生成。 (Native AOT 优缺点截图摘自张善友博…...
Git 提交代码日志信息
前言 在项目中经常用到git提交代码,每次提交时需要添加日志信息,那么一套规范的日志信息会让整个git仓库看起来赏心悦目! 以下是Git 提交代码日志信息的建议: 一、格式规范 标题(Subject) 标题是日志信息中…...
Request method ‘POST‘ not supported(500)
前端路径检查 查看前端的请求路径地址、请求类型、方法名是否正确,结果没问题 后端服务检查 查看后端的传参uri、传参类型、方法名,结果没问题 nacos服务名检查 检查注册的服务是否对应(我这里是后端的服务名是‘ydlh-gatway’,服务列表走…...
终端环境下关闭显示器
终端环境下关闭显示器 使用vbetool vbetool 使用 lrmi 来运行视频 BIOS 中的代码。目前,它能够更改 DPMS 状态、保存/恢复视频卡状态并尝试从头开始初始化视频卡。 vbetool dpms off...
常见排序算法总结 (三) - 归并排序与归并分治
归并排序 算法思想 将数组元素不断地拆分,直到每一组中只包含一个元素,单个元素天然有序。之后用归并的方式收集跨组的元素,最终形成整个区间上有序的序列。 稳定性分析 归并排序是稳定的,拆分数组时会自然地将元素分成有先后…...
【后端开发】Go语言编程实践,Goroutines和Channels,基于共享变量的并发,反射与底层编程
【后端开发】Go语言编程实践,Goroutines和Channels,基于共享变量的并发,反射与底层编程 【后端开发】Go语言高级编程,CGO、Go汇编语言、RPC实现、Web框架实现、分布式系统 文章目录 1、并发基础, Goroutines和Channels2、基于共享…...
PyTorch 2.5.1: Bugs修复版发布
一,前言 在深度学习框架的不断迭代中,PyTorch 社区始终致力于提供更稳定、更高效的工具。最近,PyTorch 2.5.1 版本正式发布,这个版本主要针对 2.5.0 中发现的问题进行了修复,以提升用户体验。 二,PyTorch 2…...
【Android】组件化嘻嘻嘻gradle耶耶耶
文章目录 Gradle基础总结:gradle-wrapper项目根目录下的 build.gradlesetting.gradle模块中的 build.gradlelocal.properties 和 gradle.properties 组件化:项目下新建一个Gradle文件定义一个ext扩展区域config.gradle全局基础配置(使用在项目…...
vulnhub靶场【哈利波特】三部曲之Aragog
前言 使用virtual box虚拟机 靶机:Aragog : 192.168.1.101 攻击:kali : 192.168.1.16 主机发现 使用arp-scan -l扫描,在同一虚拟网卡下 信息收集 使用nmap扫描 发现22端口SSH服务,openssh 80端口HTTP服务,Apach…...
HarmonyOS开发中,如何高效定位并分析内存泄露相关问题
HarmonyOS开发中,如何高效定位并分析内存泄露相关问题 (1)Allocation的应用调试方式Memory泳道Native Allocation泳道 (2)Snapshot(3)ASan的应用使用约束配置参数使能ASan方式一方式二 启用ASanASan检测异常码 (4)HWASan的应用功能介绍约束条件使能HWASan方式一方式…...
java调用ai模型:使用国产通义千问完成基于知识库的问答
整体介绍: 基于RAG(Retrieval-Augmented Generation)技术,可以实现一个高效的Java智能问答客服机器人。核心思路是将预先准备的问答QA文档(例如Word格式文件)导入系统,通过数据清洗、向量化处理…...
2023年第十四届蓝桥杯Scratch国赛真题—推箱子
推箱子 程序演示及其源码解析,可前往: https://www.hixinao.com/scratch/creation/show-188.html 若需在线编程,在线测评模考,助力赛事可自行前往题库中心,按需查找: https://www.hixinao.com/ 题库涵盖…...
银河麒麟V10-SP1设置redis开机自启
前言: redis安装请看:银河麒麟V10-SP1离线安装redis5.0.1_银河麒麟v10 redis5.0-CSDN博客 一、编辑自启文件 vim /etc/systemd/system/redis.service [Unit] DescriptionRedis In-Memory Data Store Afternetwork.target [Service] Typeforking ExecS…...
释放超凡性能,打造鸿蒙原生游戏卓越体验
11月26日在华为Mate品牌盛典上,全新Mate70系列及多款全场景新品正式亮相。在游戏领域,HarmonyOS NEXT加持下游戏的性能得到充分释放。HarmonyOS SDK为开发者提供了软硬协同的系统级图形加速解决方案——Graphics Accelerate Kit(图形加速服务…...
Node.js 实战: 爬取百度新闻并序列化 - 完整教程
很多时候我们需要爬取一些公开的网页内容来做一些数据分析和统计。而多数时候,大家会用到python ,因为实现起来很方便。但是其实Node.js 用来爬取网络内容,也是非常强大的。 今天我向大家介绍一下我自己写的一个百度新闻的爬虫,可…...
106.【C语言】数据结构之二叉树的三种递归遍历方式
目录 1.知识回顾 2.分析二叉树的三种遍历方式 1.总览 2.前序遍历 3.中序遍历 4.后序遍历 5.层序遍历 3.代码实现 1.准备工作 2.前序遍历函数PreOrder 测试结果 3.中序遍历函数InOrder 测试结果 4.后序遍历函数PostOrder 测试结果 4.底层分析 1.知识回顾 在99.…...
qt QToolButton详解
1、概述 QToolButton是Qt框架中的一个控件,它继承自QAbstractButton。QToolButton通常用于工具栏(QToolBar)中,提供了一种快速访问命令或选项的方式。与普通的QPushButton按钮相比,QToolButton通常只显示一个图标而不…...
2024年大热,Access平替升级方案,也适合Excel用户
欢迎各位看官,您来了,就对了! 您多半是Access忠实粉丝,至少是excel用户,亦或是WPS用户吧。那就对了,今天的分享肯定对您有用。 本文1100字,阅读时长2分50秒! 现实总是不尽人意&am…...
探索Scala的模式匹配:身份证识别与等级判定!!! #Scala # scala #匹配模式
在Scala编程语言中,模式匹配是一个强大且表达力丰富的特性,它允许我们以声明式的方式处理多种情况。今天,我们将通过两个有趣的例子来展示Scala模式匹配的魅力:身份证号识别和等级判定。 1. 身份证号识别:定位你的家乡…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
