【C语言】字符串
C语言用字符数组存放字符串,字符数组中的各元素依次存放字符串的各字符
- 一维字符数组:存放一个字符串(每个数组元素存放一个字符)
- 二维字符数组:存放多个一维数组(字符串);二维数组的行数是字符串的个数
类型:char
char c[6]={'a','b','c','d','e','f'};
//定义一个字符数组c,并以单个字符初始化赋值
char s[7]="abcdefg";
//等同于char s[7]={"abcdefg"};
//定义一个字符数组s,并以字符串初始化赋值
//如有定义以下字符数组:
char s[10];
//方法一:以%c的格式循环输入输出
for(int i=0;i<10;i++){scanf("%c",&a[i]);
}
for(int i=0;i<10;i++){printf("%c",a[i]);
}
//方法二:以%s的格式输入输出
scanf("%s",a);
printf("%s",a);
字符数组的结束标志为’\0’,系统在字符数组初始化赋值时会自动在末尾加一个’\0’作为字符串的结束标志,'\0’会占用一个字符大小的内存。定义字符数组时至少需要多给一个。
中文字符的使用:一个汉字占两个字节
char ch[]="爱";//数组大小有3字节
printf("%s",ch);
通常定义将要使用的字符数组,放’\0’进行初始化
char str2[100]={'\0'};
空格、回车或制表(Tab)符是输入数据的分隔符,因而不能被读入,输入遇到这些字符时,系统认为字符串输入结束。
char str3[100]={'a','b','c','\0','d','e'};
printf("%s",str3);//输出结果:abc
//如果从键盘输入空格,效果也是一样的
那么输入的字符串有空格怎么办?
gets(str3);//从键盘上输入字符串,以回车结束
puts(str3);//输出字符串,将字符串全部输出并自带一个换行
#include<stdio.h>
int main(){char name[3][10]={{"张三 你好"},{"李四你好!"},{"王五hello"}};for(int j=0;j<3;j++){puts(name[j]);}return 0;
}
以上的三个字符串都不能再添加内容,因为它们的字节上限是10
那"张三你好吗"行不行呢?这个问题留给你。
以上是“数组-字符数组”的内容,下面将进行补充
常用函数
头文件:
#include<string.h>
| 函数名 | 简介 | 使用 |
|---|---|---|
| memset | 给数组赋初值 | memset(arr,‘0’,sizeof(arr)) |
| strcmp | 比较两个字符数组 | strcmp(arr1,arr2) |
| strncmp | 比较两个字符数组的前n个元素 | strcnmp(arr1,arr2,n) |
| strcpy | 拷贝arr2到arr1 | strcpy(arr1,arr2) |
| strncmp | 拷贝arr2指向的前n个元素到arr1 | strncmp(arr1,arr2,n) |
| strcat | 将arr2拼接到arr1后 | strcat(arr1,arr2) |
| strncat | 将arr2指定长度的字符串追加到arr1后 | strncat(arr1,arr2,n) |
| strchr | 查找字符串第一次出现字符的位置 | strchr(arr,ch) |
| strrchr | 查找字符串最后一次出现字符的位置 | strrchr(arr,ch) |
| strstr | 查找字符串在字符串中出现的位置 | strstr(arr,ch) |
| strupr | 将字符串转大写 | strupr(arr) |
| strlwr | 将字符串转小写 | strlwr(arr) |
| strlen | 求字符串长度(不算结尾的’\0’) | strlen(arr) |
| strtok | 对字符串按照子字符串c(可以是单个字符)进行分割,返回分割后的子字符串 | strtok(str,c) |
| strerror | 字符串报错 | strerror(errnum) |
#include<stdlib.h>
| 函数名 | 简介 | 使用 |
|---|---|---|
| atoi | 将字符串str转为整型(支持正负数识别) | atoi(str) |
| atof | 将字符串str转为浮点型(支持正负数识别) | atof(str) |
| strtol | 把参数str所指向的字符串根据给定的base转换为一个长整数 | strtol(const char *str, char **endptr, int base) |
说明:
int a[100] = {0};// 初始化一个全0的数组
bool b[100] = {false};// 初始化一个全为false的数组
将‘0’改为‘1’,能初始化一个全1的数组吗?
将‘false'改为‘true',能初始化一个全true的数组吗?
答案是不能,想想为什么?
int a[100];
memset(a, 1, sizeof(a));// 不能初始化一个全1的数组
bool b[100];
memset(b, true, sizeof(b));// 可以初始化一个全为true的数组
使用`memset(a, 1, sizeof(a))`并不能初始化一个全1的数组,实际运行之后,数组中的每个值都是`16843009`,即二进制的`00000001 00000001 00000001 00000001`。为什么使用memset函数会出现这种情况呢?原因很简单就是由于memset函数在做初始化的时候是以字节为单位的(1Byte,也就是8位二进制数)。由于bool类型和char类型均为1个字节。所以在进行初始化的时候不会发生任何问题(bool类型在存入数组是会进行类型转换,0为false,非0为true)。但是一个int型变量是4个字节,也就是32位二进制数。那么在初始化时会将4个用于初始化的字符组合成一个int型的值。如果要将int数组全部初始化为一个非0数的话,应该怎么做?
strcmp实际上是对字符的ASCII码进行比较。返回结果:str1<str2,返回负值(-1);str1>str2,返回正值(1);str1=str2,返回0
strstr查找字符串在字符串中出现的位置。如果存在则返回指针位置,不存在则返回null
//char *strtok(char *str, const char *delim) 分解字符串str为一组字符串,delim为分隔符。
#include <string.h>
#include <stdio.h>
int main () {char str[80] = "This is - www.runoob.com - website";const char s[2] = "-";char *token;/* 获取第一个子字符串 */token = strtok(str, s); /* 继续获取其他的子字符串 */while( token != NULL ) {printf( "%s\n", token );token = strtok(NULL, s);}return(0);
}
char * strerror ( int errnum ):用于获取指向错误消息字符串的指针。返回值为char*类型,只想描述错误的字符串的指针。C语言的库函数在执行失败时,都会有一个错误码(0 1 2 3 4 5 6 7 8 9 ...)。
#include <stdio.h>
#include <string.h>
#include <errno.h>
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));printf("%s\n",strerror(6));return 0;
}
/*
运行结果:
No error
Operation not permitted
No such file or directory
No such process
Interrupted function call
Input/output error
No such device or address
*/
//场景:打开文件错误,自动生成错误码为2,通过strerror()函数显示错误信息。
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{FILE * pfile;pfile = fopen("test.tt","r");printf("错误码:%d\n",errno);if(pfile == NULL){printf("打开文件失败 代码:%s",strerror(errno));}return 0;
}
/*运行结果:
错误码:2
打开文件失败 代码:No such file or directory
*/
//atoi
#include <stdio.h>
#include <stdlib.h>
int main()
{char str1[10]="100";char str2[10]="010";char str3[10]="10s";char str4[10]="s10";char str5[10]="str";int value1=atoi(str1);int value2=atoi(str2);int value3=atoi(str3);int value4=atoi(str4);int value5=atoi(str5);printf("%d\n",value1);printf("%d\n",value2);printf("%d\n",value3);printf("%d\n",value4);printf("%d\n",value5);return 0;
}
/*运行结果:
100
10
10
0
0
*/
//如果在以上的字符串前都加一个"-"
/*运行结果:
-100
-10
-10
0
0
*/
//atof
#include <stdio.h>
#include <stdlib.h>
int main()
{char str1[10]="-100.0";char str2[10]="-010.0";char str3[10]="-10.0s";char str4[10]="-s10.0";char str5[10]="-.0str";float value1=atof(str1);float value2=atof(str2);float value3=atof(str3);float value4=atof(str4);float value5=atof(str5);printf("%f\n",value1);printf("%f\n",value2);printf("%f\n",value3);printf("%f\n",value4);printf("%f\n",value5);return 0;
}
/*运行结果:
-100.000000
-10.000000
-10.000000
0.000000
-0.000000
*/
atoi()和atof()函数有一个缺点是:如果当字符串是其他非数字字符,会返回0,如果是数字0的话,照样返回0,这样就无法辨别到底是字符’0’还是其他非数字字符。而strtol()可以识别数字字符’0’。
//根据函数运行后endptr的位置可以对上述问题进行区分,如果是’0’,endptr指向原字符串首位
#include <stdio.h>
#include <stdlib.h>
int main()
{char str[10] = "0";char *tt;int value;value = strtol(str,&tt,10);if(tt != str){printf("转后的数字为:%d",value);}else{printf("转化的是字符!");}return 0;
}
strtol()更多内容请访问:C 库函数 – strtol() | 菜鸟教程 (runoob.com)
相关文章:
【C语言】字符串
C语言用字符数组存放字符串,字符数组中的各元素依次存放字符串的各字符 一维字符数组:存放一个字符串(每个数组元素存放一个字符)二维字符数组:存放多个一维数组(字符串);二维数组的…...
云计算探索-DAS、NAS与SAN存储技术演进及其应用比较
1,介绍 随着信息技术的飞速发展,数据存储的需求日益增长,各种存储技术也应运而生。在众多的存储解决方案中,直接附加存储(Direct Attached Storage,简称DAS)、网络附加存储(Network …...
手机有线投屏到直播姬pc端教程
1 打开哔哩哔哩直播姬客户端并登录(按下图进行操作) 2 手机用usb数据线连接电脑(若跳出安装驱动的弹窗点击确定或允许),usb的连接方式为仅充电(手机差异要求为仅充电),不同品牌手机要求可能不一样,根据实际的来 3 在投屏过程中不要更改usb的连接方式(不然电脑会死机需要重启) …...
SOA、分布式、微服务之间的关系?
分布式它本身就是一种系统部署的架构理念,意思就是将一个系统拆分为各个部分,然后分别部署到不同的机器上去,SOA和微服务项目的部署方式都可以是分布式架构。 而SOA和微服务它们都是面向服务的架构,但是微服务相比于SOA在服务粒度…...
Java多线程学习(概念笔记)
面试题:并行和并发有什么区别? 现在都是多核CPU,在多核CPU下 并发是同一时间应对多件事情的能力,多个线程轮流使用一个或多个CPU 并行是同一时间动手做多件事情的能力,4核CPU同时执行4个线程 面试题:创建线…...
【C++】set和map
set和map就是我们上篇博客说的key模型和keyvalue模型。它们属于是关联式容器,我们之前说过普通容器和容器适配器,这里的关联式容器就是元素之间是有关联的,通过上篇博客的讲解我们也对它们直接的关系有了一定的了解,那么下面我们先…...
yolov5 v7.0打包exe文件,使用C++调用
cd到yolo5文件夹下 pyinstaller -p 当前路径 -i logo图标 detect.py问题汇总 运行detect.exe找不到default.yaml 这个是yolov8里的文件 1 复制权重文件到exe所在目录。 2 根据报错提示的配置文件路径,把default.yaml复制放到相应的路径下。(缺少相应…...
保研线性代数机器学习基础复习2
1.什么是群(Group)? 对于一个集合 G 以及集合上的操作 ,如果G G-> G,那么称(G,)为一个群,并且满足如下性质: 封闭性:结合性:中性…...
vultr ubuntu 服务器远程桌面安装及连接
一. 概述 vultr 上开启一个linux服务器,都是以终端形式给出的,默认不带 ui 桌面的,那其实对于想使用服务器上浏览器时的情形不是很好。那有没有方法在远程服务器安装桌面,然后原程使用呢?至少ubuntu的服务器是有的&am…...
前端学习<二>CSS基础——12-CSS3属性详解:动画详解
前言 本文主要内容: 过渡:transition 2D 转换 transform 3D 转换 transform 动画:animation 过渡:transition transition的中文含义是过渡。过渡是CSS3中具有颠覆性的一个特征,可以实现元素不同状态间的平滑过渡…...
Sqoop 的安装与配置
目录 1 下载并解压2 修改配置文件3 添加环境变量4 拷贝 JDBC 驱动5 测试Sqoop是否能够成功连接数据库 下载地址 1 下载并解压 (1)上传安装包 sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz 到 hadoop101 的 /opt/software 路径中 (2…...
Mysql设置访问权限(docker配置)
1.运行命令:docker exec -it 数据库名 bash,我这里是bot_test, docker exec -it bot_test bash 2.运行命令mysql -uroot -p --default-character-setutf8,输入密码连接数据库 3.运行命令show databases,查看当前的表 4.进入my…...
【Linux】详解软硬链接
一、软硬链接的建立方法 1.1软链接的建立 假设在当前目录下有一个test.txt文件,要对其建立软链接,做法如下: ln就是link的意思,-s表示软链接,test.txt要建立软链接的文件名,后面跟上要建立的软链接文件名…...
维修贝加莱4PP420.1043-B5触摸屏Power Panel 400工业电脑液晶
深圳捷达工控维修为贝加莱、HMI 显示电源面板 400 4PP420.1043-B5 提供专业电子维修。在 深圳捷达工控维修,我们拥有及时且经济高效地维修 B&R 、HMI Display Power Panel 400 4PP420.1043-B5 的经验。我们为发送给我们工厂维修的贝加莱 HMI 显示面板 400 4PP42…...
Java_21 完成一半题目
完成一半题目 有 N 位扣友参加了微软与力扣举办了「以扣会友」线下活动。主办方提供了 2*N 道题目,整型数组 questions 中每个数字对应了每道题目所涉及的知识点类型。 若每位扣友选择不同的一题,请返回被选的 N 道题目至少包含多少种知识点类型。 示例…...
【WPF应用21】WPF 中的 TextBox 控件详解与示例
在 Windows Presentation Foundation (WPF) 中,TextBox 控件是一个强大的输入控件,允许用户输入、编辑和选择文本。TextBox 控件在各种应用程序中都非常常见,例如表单、对话框和编辑器。本文将详细介绍 TextBox 控件的功能、使用方法、属性、…...
小程序页面传参?
小程序页面之间传递参数通常可以通过以下几种方式实现: 通过 URL 参数传递:可以在跳转目标页面时,在 URL 中添加参数,目标页面可以通过 options 参数获取传递过来的数据。 // 页面 A wx.navigateTo({url: targetPage?param1value…...
C++list的模拟实现
为了实现list,我们需要实现三个类 一、List的节点类 template<class T> struct ListNode {ListNode(const T& val T()):_pPre(nullptr),_pNext(nullptr),_val(val){}ListNode<T>* _pPre;ListNode<T>* _pNext;T _val; }; 二、List的迭代器…...
Leetcode 187. 重复的DNA序列
DNA序列 由一系列核苷酸组成,缩写为 ‘A’, ‘C’, ‘G’ 和 ‘T’.。 例如,“ACGAATTCCG” 是一个 DNA序列 。 在研究 DNA 时,识别 DNA 中的重复序列非常有用。 给定一个表示 DNA序列 的字符串 s ,返回所有在 DNA 分子中出现不…...
都江堰泛计算操作系统(多机)应用方向
1、异构多核芯片 DJYOS是全球唯一支持异构多核的操作系统。当前的系统级芯片,为了适应多样化的用户需求,基本上都采用了异构多核架构。传统操作系统就需要在一个芯片内,运行多种操作系统,开发工作更加复杂,运行协同性低…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...
