当前位置: 首页 > news >正文

【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到arr1strcpy(arr1,arr2)
strncmp拷贝arr2指向的前n个元素到arr1strncmp(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语言用字符数组存放字符串&#xff0c;字符数组中的各元素依次存放字符串的各字符 一维字符数组&#xff1a;存放一个字符串&#xff08;每个数组元素存放一个字符&#xff09;二维字符数组&#xff1a;存放多个一维数组&#xff08;字符串&#xff09;&#xff1b;二维数组的…...

云计算探索-DAS、NAS与SAN存储技术演进及其应用比较

1&#xff0c;介绍 随着信息技术的飞速发展&#xff0c;数据存储的需求日益增长&#xff0c;各种存储技术也应运而生。在众多的存储解决方案中&#xff0c;直接附加存储&#xff08;Direct Attached Storage&#xff0c;简称DAS&#xff09;、网络附加存储&#xff08;Network …...

手机有线投屏到直播姬pc端教程

1 打开哔哩哔哩直播姬客户端并登录(按下图进行操作) 2 手机用usb数据线连接电脑(若跳出安装驱动的弹窗点击确定或允许),usb的连接方式为仅充电(手机差异要求为仅充电),不同品牌手机要求可能不一样,根据实际的来 3 在投屏过程中不要更改usb的连接方式(不然电脑会死机需要重启) …...

SOA、分布式、微服务之间的关系?

分布式它本身就是一种系统部署的架构理念&#xff0c;意思就是将一个系统拆分为各个部分&#xff0c;然后分别部署到不同的机器上去&#xff0c;SOA和微服务项目的部署方式都可以是分布式架构。 而SOA和微服务它们都是面向服务的架构&#xff0c;但是微服务相比于SOA在服务粒度…...

Java多线程学习(概念笔记)

面试题&#xff1a;并行和并发有什么区别&#xff1f; 现在都是多核CPU&#xff0c;在多核CPU下 并发是同一时间应对多件事情的能力&#xff0c;多个线程轮流使用一个或多个CPU 并行是同一时间动手做多件事情的能力&#xff0c;4核CPU同时执行4个线程 面试题&#xff1a;创建线…...

【C++】set和map

set和map就是我们上篇博客说的key模型和keyvalue模型。它们属于是关联式容器&#xff0c;我们之前说过普通容器和容器适配器&#xff0c;这里的关联式容器就是元素之间是有关联的&#xff0c;通过上篇博客的讲解我们也对它们直接的关系有了一定的了解&#xff0c;那么下面我们先…...

yolov5 v7.0打包exe文件,使用C++调用

cd到yolo5文件夹下 pyinstaller -p 当前路径 -i logo图标 detect.py问题汇总 运行detect.exe找不到default.yaml 这个是yolov8里的文件 1 复制权重文件到exe所在目录。 2 根据报错提示的配置文件路径&#xff0c;把default.yaml复制放到相应的路径下。&#xff08;缺少相应…...

保研线性代数机器学习基础复习2

1.什么是群&#xff08;Group&#xff09;&#xff1f; 对于一个集合 G 以及集合上的操作 &#xff0c;如果G G-> G&#xff0c;那么称&#xff08;G&#xff0c;&#xff09;为一个群&#xff0c;并且满足如下性质&#xff1a; 封闭性&#xff1a;结合性&#xff1a;中性…...

vultr ubuntu 服务器远程桌面安装及连接

一. 概述 vultr 上开启一个linux服务器&#xff0c;都是以终端形式给出的&#xff0c;默认不带 ui 桌面的&#xff0c;那其实对于想使用服务器上浏览器时的情形不是很好。那有没有方法在远程服务器安装桌面&#xff0c;然后原程使用呢&#xff1f;至少ubuntu的服务器是有的&am…...

前端学习<二>CSS基础——12-CSS3属性详解:动画详解

前言 本文主要内容&#xff1a; 过渡&#xff1a;transition 2D 转换 transform 3D 转换 transform 动画&#xff1a;animation 过渡&#xff1a;transition transition的中文含义是过渡。过渡是CSS3中具有颠覆性的一个特征&#xff0c;可以实现元素不同状态间的平滑过渡…...

Sqoop 的安装与配置

目录 1 下载并解压2 修改配置文件3 添加环境变量4 拷贝 JDBC 驱动5 测试Sqoop是否能够成功连接数据库 下载地址 1 下载并解压 &#xff08;1&#xff09;上传安装包 sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz 到 hadoop101 的 /opt/software 路径中 &#xff08;2&#xf…...

Mysql设置访问权限(docker配置)

1.运行命令&#xff1a;docker exec -it 数据库名 bash&#xff0c;我这里是bot_test, docker exec -it bot_test bash 2.运行命令mysql -uroot -p --default-character-setutf8&#xff0c;输入密码连接数据库 3.运行命令show databases&#xff0c;查看当前的表 4.进入my…...

【Linux】详解软硬链接

一、软硬链接的建立方法 1.1软链接的建立 假设在当前目录下有一个test.txt文件&#xff0c;要对其建立软链接&#xff0c;做法如下&#xff1a; ln就是link的意思&#xff0c;-s表示软链接&#xff0c;test.txt要建立软链接的文件名&#xff0c;后面跟上要建立的软链接文件名…...

维修贝加莱4PP420.1043-B5触摸屏Power Panel 400工业电脑液晶

深圳捷达工控维修为贝加莱、HMI 显示电源面板 400 4PP420.1043-B5 提供专业电子维修。在 深圳捷达工控维修&#xff0c;我们拥有及时且经济高效地维修 B&R 、HMI Display Power Panel 400 4PP420.1043-B5 的经验。我们为发送给我们工厂维修的贝加莱 HMI 显示面板 400 4PP42…...

Java_21 完成一半题目

完成一半题目 有 N 位扣友参加了微软与力扣举办了「以扣会友」线下活动。主办方提供了 2*N 道题目&#xff0c;整型数组 questions 中每个数字对应了每道题目所涉及的知识点类型。 若每位扣友选择不同的一题&#xff0c;请返回被选的 N 道题目至少包含多少种知识点类型。 示例…...

【WPF应用21】WPF 中的 TextBox 控件详解与示例

在 Windows Presentation Foundation (WPF) 中&#xff0c;TextBox 控件是一个强大的输入控件&#xff0c;允许用户输入、编辑和选择文本。TextBox 控件在各种应用程序中都非常常见&#xff0c;例如表单、对话框和编辑器。本文将详细介绍 TextBox 控件的功能、使用方法、属性、…...

小程序页面传参?

小程序页面之间传递参数通常可以通过以下几种方式实现&#xff1a; 通过 URL 参数传递&#xff1a;可以在跳转目标页面时&#xff0c;在 URL 中添加参数&#xff0c;目标页面可以通过 options 参数获取传递过来的数据。 // 页面 A wx.navigateTo({url: targetPage?param1value…...

C++list的模拟实现

为了实现list&#xff0c;我们需要实现三个类 一、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序列 由一系列核苷酸组成&#xff0c;缩写为 ‘A’, ‘C’, ‘G’ 和 ‘T’.。 例如&#xff0c;“ACGAATTCCG” 是一个 DNA序列 。 在研究 DNA 时&#xff0c;识别 DNA 中的重复序列非常有用。 给定一个表示 DNA序列 的字符串 s &#xff0c;返回所有在 DNA 分子中出现不…...

都江堰泛计算操作系统(多机)应用方向

1、异构多核芯片 DJYOS是全球唯一支持异构多核的操作系统。当前的系统级芯片&#xff0c;为了适应多样化的用户需求&#xff0c;基本上都采用了异构多核架构。传统操作系统就需要在一个芯片内&#xff0c;运行多种操作系统&#xff0c;开发工作更加复杂&#xff0c;运行协同性低…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;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日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域&#xff0c;REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名&#xff0c;不断适应这些现代范式的需求。随着不断发展的生态系统&#xff0c;Java 在现代 API 方…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型&#xff0c;它将权限分配给角色&#xff0c;再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...