【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)

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

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

相关文章

Python - 深度学习系列31 - ollama的搭建与使用

说明 做这个的主要目的是为了搭建Langchain的本地环境&#xff0c;使用LangChain让LLM具备调用自定义函数的功能。 内容 1 安装server 以下将ollama的安装方式&#xff0c;以及使用做一个简单的说明(记录&#xff09;。之前对这个工具没有了解&#xff0c;只是从快速实践的…

Linux速览(2)——环境基础开发工具篇(其一)

本章我们来介绍一些linux的常用工具 目录 一. Linux 软件包管理器 yum 1.什么是软件包? 2. 查看软件包 3. 如何安装软件 4. 如何卸载软件 5.yum补充 6. 关于 rzsz 二. Linux编辑器-vim使用 1. vim的基本概念 2. vim的基本操作 3. vim正常模式命令集 4. vim末行模式…

2013年认证杯SPSSPRO杯数学建模C题(第一阶段)公路运输业对于国内生产总值的影响分析全过程文档及程序

2013年认证杯SPSSPRO杯数学建模 C题 公路运输业对于国内生产总值的影响分析 原题再现&#xff1a; 交通运输作为国民经济的载体&#xff0c;沟通生产和消费&#xff0c;在经济发展中扮演着极其重要的角色。纵观几百年来交通运输与经济发展的相互关系&#xff0c;生产水平越高…

AUTOSAR-OS上层需求总结

本文是《Requirements on Operating System》这篇官方文档的学习笔记&#xff0c;主要记录了一些AUTOSAR对操作系统(OS)相关的需求准则。 1 RTOS相关要求&#xff08;Real-Time Operating System&#xff09; 1.1 [SRS_Os_00097] 操作系统&#xff08;OS&#xff09;的API需要…

深度解析:国内主流音视频产品的核心功能与市场表现

前言 当前音视频开发领域呈现出多样化竞争态势&#xff0c;其中声网&#xff08;Agora&#xff09;、即构&#xff08;ZEGO&#xff09;等云通讯企业占据了市场的主导地位。随着技术的持续进步和用户需求的日益多样化&#xff0c;选择音视频服务提供商的标准也越来越个性化&am…

unity学习(74)——服务器Dispose异常

1.返回的1 2 11是怪物初始化&#xff0c;源代码中也没有 2. 3.客户端中的网络连接初始化如下&#xff1a; 4.不是因为超时&#xff0c;设置10s为超时期限后&#xff0c;客户端和服务器有时依然会报错&#xff01; 5.我感觉就是update中发包给弄坏的&#xff01; 6.不在“帧”…

Python版【植物大战僵尸 +源码】

文章目录 写在前面&#xff1a;功能实现环境要求怎么玩个性化定义项目演示&#xff1a;源码分享Map地图:Menubar.py主菜单 主函数&#xff1a;项目开源地址 写在前面&#xff1a; 今天给大家推荐一个Gtihub开源项目&#xff1a;PythonPlantsVsZombies&#xff0c;翻译成中就是…

【云开发笔记No.18】说说腾讯的TKE

在云原生开发领域中&#xff0c;TKE&#xff08;Tencent Kubernetes Engine&#xff09;是一个重要的组成部分。TKE是腾讯云提供的一种托管的容器管理服务&#xff0c;它基于开源的Kubernetes系统&#xff0c;旨在简化容器的部署、管理和扩展&#xff0c;同时提供高性能、可靠性…

web 技术中前端和后端交互过程

1、客户端服务器交互过程 客户端:上网过程中,负责浏览资源的电脑,叫客户端服务器:在因特网中,负责存放和对外提供资源的电脑叫服务器 服务器的本质: 就是一台电脑,只不过相比个人电脑它的性能高很多,个人电脑中可以通过安装浏览器的形式,访问服务器对外提供的各种资源。 个人…

【JavaEE初阶系列】——常见的锁策略

目录 &#x1f6a9;乐观锁和悲观锁 &#x1f6a9;读写锁和普通互斥锁 &#x1f6a9;轻量级锁和重量级锁 &#x1f6a9;自旋锁和挂起等待锁 &#x1f6a9;公平锁和非公平锁 &#x1f6a9;可重入锁和不可重入锁 &#x1f6a9;关于synchronized的锁策略以及自适应 接下来讲解的锁策…

transformers微调模型后使用pieline调用无法预测列表文本

初学transformers框架 使用trainer简单训练一个文本分类模型三个epoch后 使用piepline调用model 和tokenizer后 发现 传入列表文本后 输出就变得不正常了&#xff0c;为么子哇 如下图

git 代码管理仓库/安装部署

系统环境准备 cat /etc/reshat-release #查看系统版本 uname -r #查看版本内核 sed -i s/SELINUXenforcing/SELINUXdisabled/ /etc/selinux/config #关闭selinux systemctl stop firewalld #关闭防火墙 Git安装部署 rpm -qa | grep git …

macbook pro 2018 T2 芯片安装 archlinux 双系统

文章目录 [toc]配置无线网和分区修改时区安装内核和驱动自动生成 fstab 文件配置 pacman切换到安装好的系统设置时区配置 pacman 国内源安装 gui安装 GRUB 引导建立引导 增加内核模块配置开机自启修改 root 用户密码创建普通用户配置 sudo 重启进入新系统配置 wlan 自动连接 wi…

整理-2023年信息安全报告汇总

《2023年度网络安全威胁报告》&#xff1a;该报告详细分析了2023年全球范围内的网络安全威胁情况&#xff0c;包括恶意软件、钓鱼攻击、勒索软件等。报告还指出了不同行业和地区面临的特定威胁&#xff0c;以及相应的防御策略。《2023年云安全趋势报告》&#xff1a;随着云计算…

语义分割——Dark Zurich数据集

一、重要性及意义 首先&#xff0c;Dark Zurich为语义分割提供了大量真实且多样化的图像数据。该数据集包含了在夜间、黄昏和白天拍摄的大量图像&#xff0c;涵盖了不同光照条件和场景下的图像变化。这些图像数据不仅丰富了语义分割任务的数据集&#xff0c;也为模型提供了更全…

C++之STL整理(5)之string 用法(创建、赋值、增删查改)整理

C之STL整理&#xff08;5&#xff09;之string 用法&#xff08;创建、赋值、增删查改&#xff09;整理 注&#xff1a;整理一些突然学到的C知识&#xff0c;随时mark一下 例如&#xff1a;忘记的关键字用法&#xff0c;新关键字&#xff0c;新数据结构 C 的string用法整理 C之…

acwing1114

#include<bits/stdc.h> using namespace std; const int N10; int n,k; char g[N][N]; //记录每列放没放过 bool st[N]; int res0; //x表示当前枚举到了哪一行&#xff0c;cnt记录放了几颗棋 void dfs(int x,int cnt){ if(cntk){ res; return ; …

go语言切片的容量是怎样增长的

在Go语言中&#xff0c;切片&#xff08;slice&#xff09;的容量增长与其底层数组&#xff08;array&#xff09;的分配机制有关。当切片容量不足以容纳更多元素时&#xff0c;Go会创建一个新的底层数组&#xff0c;并自动将现有元素复制到这个新数组中。新数组的容量通常是原…

利用scala书写spark程序实现wordCount

实验环境&#xff1a;虚拟机&#xff08;centos&#xff09;上创建了三台集群&#xff0c;部署了Hadoop&#xff0c;words文档放在HDFS上的目录下 所用版本如下&#xff1a; <hadoop.version>2.7.7</hadoop.version> <spark.version>2.4.5</spark.version…

LLM:函数调用(Function Calling)

1 函数调用 虽然大模型能解决很多问题&#xff0c;但大模型并不能知晓一切。比如&#xff0c;大模型不知道最新消息(GPT-3.5 的知识截至 2021年9月&#xff0c;GPT-4 是 2023 年12月)。另外&#xff0c;大模型没有“真逻辑”。它表现出的逻辑、推理&#xff0c;是训练文本的统计…