【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是全球唯一支持异构多核的操作系统。当前的系统级芯片,为了适应多样化的用户需求,基本上都采用了异构多核架构。传统操作系统就需要在一个芯片内,运行多种操作系统,开发工作更加复杂,运行协同性低…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...
CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?
在现代前端开发中,Utility-First (功能优先) CSS 框架已经成为主流。其中,Tailwind CSS 无疑是市场的领导者和标杆。然而,一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...
