c语言中的字符串

C 语言中的字符串详解 在 C 语言中,字符串是由一组字符组成的字符序列。字符串常常被用来表示文本信息。C 语言中没有专门的字符串数据类型,字符串实际上是字符数组的一种特例。// 定义一个字符数组,长度为 20这个 str 数组能够存储最多 19 个字符(因为最后一个位置要存储一个 ‘\0’ 字符)。在 C 语言中,字符串是以 ‘\0’(即空字符)结束的,因此它的长度通常等于数组大小减去 1。 阅读详情

一、C语言中的字符串

字符串是一种重要的数据类型,但是C语言并没有显示的字符串数据类型,不像java有String ,OBC有NSString等等。所以C语言中的字符串一般以字符串常量的形式出现或者存储与字符数组中。

每个字符串的末尾都添加了代码值为0的特殊字符,这个字符称为空字符(不要和NULL搞混C中的字符串),写作\0。字符串,总是由\0字符结束,所以字符串的长度永远比字符串中的字符数多1。可以将\0字符添加到字符串的结尾,但是这会使字符串的末尾有两个\0的字符。\0 即是字符串结束的标志。


二、字符数组存储字符串

声明如:char  str[4];

初始化如:str="abc";

例子1:

int main(void)
{
    char str[3]=“123”;
    printf("%s",str);
    return 1;
}

这样的程序,编译的时候直接不能让通过,会报下面的错误:

: array bounds overflow。

因为,这样的写法就是声明并初始化一个字符串,而字符串必须使用\0结尾,所以数组才会越界。如果像下面:

例子2:

int main(void)
{
    char str[3]={'1','2','3'};
    printf("%s",str);
    return 1;
}

这样写,就是声明并初始化一个字符数组,当然不会报错,可是看输出

结果却和奇怪,其实一点也不用奇怪,用%s的形式输出一个字符数组,那么就会把这个字符数组当字符串输出,可是他并不是一个正确的字符串格式,所以只能根据数组指针的后移,一直不断的输出,直到遇到内存中随机的出现的\0才会结束,所以才会有这样的结果。

所以在声明和初始化一个字符串的时候一定要注意。一般可以这样去声明和初始化一个字符串:

char str[]="123123asda";

数组的长度自己并不指定,而是有系统自己确定,这样就不会出现数组越界的问题了。


三、使用库函数操作字符串

字符串函数在<string.h>头文件中声明,所以如果要使用它们,需要在程序的开始处使用include包含进来。

1、复制字符串

strcpy

函数原型:char *strcpy(char *destin, char *source);

参数类型为字符数组名,destin为目标字符串,source为源字符串。将字符串source的内容复制到destin,注意该函数不检查数组长度,所以要确保destin的数组能够容纳source中的所有字符。


另一个可用的函数strncpy

函数原型;char * strncpy(char *dest, char *src, size_t n);

将字符串src中最多n个字符复制到字符数组dest中(它并不像strcpy一样遇到NULL才停止复制,而是等凑够n个字符才开始复制),返回指向dest的指针。第三个参数是一个size_t类型的整数。它指定了要复制的字符数n,举例:


2、检测字符串的实际长度

strlen

函数原型: size_t strlen(conset char *s);

功能: strle函数求的是字符串的长度,它求得方法是从字符串的首地址开始到遇到第一个'\0'停止计数,如果你只定义没有给它赋初值,这个结果是不定的,它会从字符串首地址一直记下去,直到遇到'\0'才会停止。  

sizeof(string)可以输出一个字符串占的字节数,因为一个char是一个字节,在加上结束符\0(可能不止一个\0),所以sizeof得出的结果比字符串实际的长度大。

而是用strlen(string)  则可以得出字符串的实际长度。


size_t数据类型

类型size_t在标准库头文件<stddef.h>中定义,它也是运算符sizeiof()的返回类型。类型size-t定义了一个无符号的整数类型unsigned int。之所以要这么做,是考虑到代码的可移植性。在各种C语言中,sizeof()和strlen()函数的返回类型互不相同。这是由编译器的作者来决定的。把这个类型定义为size_t,并把size_t定义放在头文件中,非常便于在代码中包容这种依赖性。

所以,要正确的使用size_t类型,因为它是一个无符号整数,在表达式中使用无符号数可能导致不可预料的结果,如下:

if(strlen(x) >= strlen(y))

if(strlen(x) - strlen(y)>=0)

上面这两个表达式看起来是相当的,实际上它们是不等的。第一条语句会按照预想的工作,但是第二条语句就永远都是成立的,因为两个无符号整数的运算结果是一个无符号整数,永运都是>=0的。

所以要注意了,可以将得到的size_t强转为int类型,在用于计算。


3、连接字符串

strcat

函数原型: char *strcat(char *destin, char *source);

它会将字符串source连接到字符串destin的末尾,并且返回destin


也可以使用strncat

函数原型:用 法: char *strcat(char *destin, char *source,size_t n);

  第三个参数也是size_t的类型,这个函数是表示将字符串source的前面n个字符连接到destin的末尾



4、比较字符串

strcmp

函数原型:int strcmp(char *str1, char *str2);

如果str1>str2 返回值>0,如果str1=str2 返回值=0,如果str1<str2 返回值<0。


strncmp

函数原型: int strncmp(char *str1, char *str2, unsigned maxlen);

比较两个字符串的前maxlen个字符


strnicmp

函数原型: int strnicmp(char *str1, char *str2, unsigned maxlen);

比较两个字符串的前maxlen个字符,不区分大小写。


5、搜索字符串

strchr

函数原型:char *strchr(char *str, char c);

第一个参数是要搜素的字符串(是char数组的地址),第二个参数是要查找的字符。这个函数会从字符串的开头开始搜索,返回在字符串中找到的第一个给定字符的地址。这是一个在内存中的地址,其类型为char*,表示“char的指针”,所以要存储返回值,必须创建一个能存储字符地址的变量。如果没有找到给定的字符,函数就会返回NULL,他相当于0,表示这个指针没有指向任何对象。

举例:

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include <string.h>  
  3.   
  4. int main(void)  
  5. {  
  6.     char str1[]="abcd";  
  7.     char *p=strchr(str1,'c');  
  8.     if(p!=NULL)  
  9.     {  
  10.         int a=p-str1;  
  11.         printf("%d",a);  
  12.     }  
  13.     return 1;  
  14. }  

strtchr和strchr非常类似,只不过是从字符串末尾开始查找。


strstr

函数原型;_CRTIMP char *  __cdecl strstr(const char *, const char *);

它查找一个字符串中的子字符串,返回找到的第一个子字符串的位置指针。如果找不到匹配的字符串串,就返回NULL。

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include <string.h>  
  3.   
  4. int main(void)  
  5. {  
  6.     char str1[]="abcd";  
  7.     char str2[]="cd";  
  8.     char *p=strstr(str1,str2);  
  9.     if(p!=NULL)  
  10.     {  
  11.         int a=p-str1;  
  12.         printf("%d",a);  
  13.     }  
  14.     return 1;  
  15. }  


6、分析和检测字符串

islower()    小写字符

isupper()    大写字母

isalpha()   大写或小写字母

isalnum()  大写或小写字符,或数字

isprintf()   可打印字符,包括空格

isgraph()  可打印字符,不包括空格

isdigit()   十进制数字的字符('0'~'9')

isxdigit()   十六进制数字的字符('0'~'9'、‘A’~'F','a'~'f')

isblank()  标准空白字符(空格、'\t')

isspace()   空白字符(空格、'\n','\t','\'v','r\','\f')

ispunct()     isspace()和isalnum返回false的可打印字符



toupper()  转变为大写字符

tolower()  转变为小写字符

atof()      从字符串中生成double类型的值

atoi()      从字符串中生成int类型的值

atol()      从字符串中生成long类型的值

atoll()    从字符串中生成long  long类型的值


四、使用宽字符

使用宽字符串与使用前面的字符串一样简单。宽字符串存储在wchar_t类型的数组中,宽字符串常量只需要在前面加上L修饰符。举例:

wchar_t proverb[]=L"A kls a";

wchar_t字符占用2个字节。proverb字符串包含7个字符和终止空字符,所以占用16个字节。

如果要使用printf()将字符串输出到屏幕上,必须使用%S格式指定符,而不是用于ASCII字符串的%s,

如果使用了%s,printf()函数就假定字符串包含单字节字符,这样结果就不正确了。


宽字符的操作函数:

<wchar.h>头文件声明了一些函数来操作宽字符串,它们对应于处理一般字符串的函数。





【通信协议-RTCM】MSM语句(1) - 多信号GNSS观测数据消息格式 注释:RTCM响应消息1020为GLONASS星历信息,暂不介绍,前公司暂未研发RTCM消息类型版本的DR/RTK模块,DR/RTK模块仅NMEA消息类型使用注释:公司使用的多信号语句类型为MSM4&MSM7,也应该是运用最广泛的语句类型,例如本人之前在公司开发的工具全是基于MSM7语句类型来进行的。 阅读详情

相关推荐

网络虚拟化介绍(OVS、DVS)

网络虚拟化概念网络虚拟化就是把网络层的一些功能从硬件中剥离出来,建立新的网络虚拟层;该虚拟层可以接管网络服务和配置,实现网络服务与物理层的解耦,打破物理资源限制;通过网络虚拟层能够在一个物理网络上模拟出多个逻辑网络,并且多用户在逻辑网络上相互隔离,保证网络安全网络虚拟化的特点隔离性:不同租户的流量相互之间不能互访;但是IP/MAC地址都可以独立规划可移动性:虚拟机可以跨二层/三层迁移,甚至可以跨广域网迁移(迁移前后虚拟机Vlan和IP地址都不会发生变化)可扩展性:逻辑网络的规模和数量可扩展。

m0_49864110的博客 1万+

C语言:sizeof和strlen计算有关数组字节大小

C语言:sizeof和strlen区别实例:计算数组字节大小

tydo达令的博客 1368

基于价值的深度强化学习:DQN

本文主要是介绍DQN原理和算法伪代码和代码实现,算法实现包括pytorch版本和stable-baselines3版本

溯源的专栏 1085

strlen()多出3个字符的长度?

看着第三行代码没毛病,输出长度却为7.查找了半天, 网上说是bom的原因,去了一通bom还是不行。 搞了半个小时,终于把这个原因找到了。 wo次奥,原来是搜狗输入法不小心输入了个看不见的字符。用 ord 查看 是ascii 编码为 239 的一个字符。看来输入法切换的时候还是得小心啊。 注:128—255的是扩展字符,比如说227的pi(圆周率)不经常用,其中也有很多字符时打印不出来的,是控制字符 这个内鬼还是可以用光标选中的,但是肉眼看不到: 正常光标是这样的: 以后...

IT技术宅-北方的刀郎 843

wincc 服务器授权型号,WinCC V7.5 SP1软件安装及授权方法

上篇教程给大家介绍了TIA Portal V16 安装方法,今天分享一下WinCC V7.5 SP1。目前V7.5 SP1是WinCC最新的版本,发布时间2019年11月13日。先放一个官网对WinCC V7.5 的介绍视频,感兴趣的可以先看一下。1、软件下载官网下载链接:https://support.industry.siemens.com/cs/document/109772879五个文件下...

weixin_39956110的博客 1万+

Visual Studio 2022 社区版安装指南:从下载到配置的完整流程

本文详细介绍了Visual Studio 2022社区版的完整安装与配置流程,包括系统要求检查、官方下载步骤、工作负载选择、安装位置配置等关键环节。作为微软推出的免费集成开发环境,VS2022社区版支持多种编程语言,适合个人开发者和小型团队使用。文章还提供了常见问题解决和性能优化技巧,帮助用户高效完成开发环境搭建。

weixin_28829339的博客 882

字符串长度问题strlen( )

今天刷题的时候,有一个字符串的题一直出现乱码,研究了半天才发现,不同的赋值方法使字符串长度不同。 strlen()这个函数的功能是返回字符串的长度,下面用代码说明。 #include&lt;iostream&gt; #include&lt;string.h&gt; #include&lt;stdlib.h&gt; using namespace std; int main() { char a[...

lzc842650834的博客 1120

51单片机也能玩转信号发生器?手把手教你用DAC0832和LM358输出四种标准波形

本文详细介绍了如何使用51单片机和DAC0832芯片搭配LM358运放,自制低成本信号发生器,实现正弦波、矩形波、三角波和锯齿波四种标准波形的输出。从硬件选型、电路设计到编程实现,手把手教你完成这一实用电子项目,总成本不到50元,适合电子爱好者和学生实践。

weixin_30530939的博客 552

sizeof(char数组),长度多1,导致排序紊乱

疑问代码: void charTest() { char b[]="badcfeg"; int length2=sizeof(b)/sizeof(b[0]); cout<<length2; } 结果是8。 我原本是为了选择排序使用,但是程序结果出错。后来分析定位错误,原来是我长度搞错了。 原因分析: char数组最后\0也占一位。 拓展: void main() { char s[]="\12345s\n"; cout<<sizeof(s); }

捡破烂日记^ ^ 1353

快速入门必看!RT-DETR手把手训练自己的数据集去跑实验,基于 ultralytics 仓库源码改进,配置虚拟环境,准备数据集、训练、验证、推理测试 ,实现0到1的完整教学过程。

本文介绍了使用Ultralytics框架训练RT-DETR模型的全流程。首先需要创建Python 3.10虚拟环境,安装指定版本的PyTorch和相关依赖包。然后准备数据集,修改配置文件,并详细介绍训练、验证和推理三个核心步骤的代码实现。训练阶段使用RTDETR类加载模型配置,设置训练参数;验证阶段评估模型性能;推理阶段可对图片、视频等进行预测。文中还提供了清华大学镜像源加速下载,以及详细的参数配置说明,帮助用户快速搭建RT-DETR目标检测模型。

Ai缝合怪、助力小伙伴高效发论文 5564

ROS与Qt5人机交互界面开发:添加rviz显示界面

最后,点击"完成"以创建新的Qt5应用程序项目。通过结合ROS和Qt5,您可以创建强大的人机交互界面,以实现丰富的机器人控制和数据可视化。在本教程中,我们将在主窗口中创建一个简单的按钮,用于启动rviz显示界面。在Qt Creator的槽函数编辑器中,为按钮添加一个槽函数,该函数将在单击按钮时调用。在上面的代码中,我们使用QProcess类启动了一个新的进程,并执行"rviz"命令来启动rviz显示界面。当您单击Qt5应用程序中的按钮时,将会启动一个新的rviz窗口,显示机器人数据的可视化界面。

CodeJolt的博客 2067

C语言字符串赋值的方法

首先,C语言没有向C++,Java,python等面向对象的语言中string这样的字符串类型,C语言中的字符串是存放在字符型数组中的 C语言中,常见的3种字符串赋值有如下: 1、通过字符数组直接初始化 int main() { char str[10] = "China";//还可以写成char str[10] ;str[10] = "China"; printf("str = %s", &str); return 0; } 但是,直接把数组元素赋值给数组名(也就是数组首元素的地址),是不

shanglala的博客 13万+

AOSP 8.0.0编译中的ANDROID_DATA缺失问题解决方案

在AOSP编译过程中,环境变量和路径设置的正确性至关重要。遇到相关的错误时,检查并修正环境配置通常是解决问题的关键。希望本文提供的分析和解决方案能帮助你顺利编译AOSP。

m0_74337424的博客 398

c语言字符串

c语言字符串都是以“/0”结尾 而这里就有三个概念 EOF /0  -1 /n 首先c语言中所有字符串的结尾标志都是/0 是字符串结尾的标志 它是一种转义符 而EOF是文件流结束标志代表着 文件(file),也可以是标准输入(stdin)的输入结束 而我们都知道大多数程序EOF的传递是靠-1这个返回值控制的  就相当于 #define EOF (-1) (在stdio.h中是这样定义的) 而'...

viafcccy的博客 3万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C语言中的字符串初始化

1、C语言没有字符串类型,通过字符数组模拟,C语言字符串,以字符‘\0’, 数字0。 2、数组指定长度后,后面没有赋值的元素,自动补0。 char buf[100] = { 'a', 'b', 'c' }; 3、所有元素赋值为0。 char buf[100] = { 0 }; ...

嵌入式 2万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C语言字符串

字符串字面量是const 的数据(常量),由于 *b 指向这个 const 数据,所以实际上b 是const char * b ,但是由于历史的原因,编译器接受不带 const 的写法,这意味这不能用 b 改变它指向的数据,但是仍然可以改变 b 的值,就是让 b 指向别的位置。如果把一个字符串字面量拷贝给一个数组,就可以随意改变数据,除非把数组声明为 const,数组元素是变量,但是数组名不是变量。 ...

qq_43627501的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C语言中字符串比较

在单片机串口实现字符串命令解析这篇文章中分析了在串口通信中如何去解析字符串命令,这篇文章就来讨论下字符串比较的方法都有哪些? 说起比较运算,肯定第一时间想到了C语言中关于比较的相关运算符 “>、<、!=、>=、<=、==”,那么要比较两个字符串是否相等是不是直接用“==”比较就行了。下面就来看看这种方法行不行? 先看一个例子 void main( void ) { char s1[] = "abc"; char s2[] ...

HXYDJ的博客 2万+

C语言中的字符串

这块内存空间将用来存储字符串字面值中的字符,以及一个用来标志字符串末尾的标记字符 (空字符)。而且,这样的存储方式很灵活,对字符串数组进行排序的时候,我们只需要交换指针即可,不需要复制整个字符串。比如,对这一组字符串进行排序,就需要复制整个字符串里面的内容。设计一个输入函数:它不会跳过前面的空白字符,并且在第一个换行符 (不存储到字符串中) 处停止读取,如果输入的字符串太长,那么就忽略额外的字符。而且,这样的存储方式很灵活,对字符串数组进行排序的时候,我们只需要交换指针即可,不需要复制整个字符串。

caijirui_rui的博客 840

C语言字符串详解

字符串是一种非常重要的数据类型,但是C语言不存在显式的字符串类型,C语言中的字符串都以字符串常量的形式出现或存储在字符数组中。同时,C 语言提供了一系列库函数来对操作字符串,这些库函数都包含在头文件 string.h 中。 一、字符串常量和字符数组 1、什么是字符串常量 C 语言虽然没有字符串类型,但是 C语言提是存在字符串这个概念的,也就是字符串常量:以 NUL 字节结尾的 0 个或多个字符组成的序列。字符串常量是不可被修改的,一般用一对双引号(" ")括起的一串字符来表示字符串常量,如:   "

weixin_55305220的博客 6954

C语言之字符串

这是一个字符数组的声明。它分配了10个连续的char类型的存储空间。你可以使用这个数组来存储最多9个字符的字符串(第10个字符用来存储字符串结束符’\0’),或者任何其他的字符数据。它可以执行的操作有:利用索引运算符取、改元素。当此字符表示存储字符串时,可以直接作为参数传递给字符串处理函数。

weixin_49863600的博客 2024

C语言如何截取字符串中的子字符串

C语言中截取字符串 截取:开始的字符串 while(*p!=0x3a) { p++; } p++; while(*p!=0x3a)p字符串可以是我们获取的或者是我们自己定义的,这里我们是截取:之后或者字符串里的数字,我们观察这段字符串有什么特点。 我们发现数字开头的字符串前是&quot;:&quot;,我们对应ASCII表找到&quot;:&quot;对应的ASCII值。 这里附带ASCII表的链接,https://baike.s...

qq_39763227的博客 3万+

C 语言中的 字符串

1字符串常量、字符数组 字符串常量是一对双撇号括起来的字符序列,例如: "helloworld"、"12345"、""(一个空字符串) 如"helloworld"在内存中是: h e l l o w o r l d \0 在C语言中,是将字符串作为字符数组来处理。了解这一点很重要。 规定:在每一个字符串的结尾加一个“字符串结束标志”,以便系统据此判断字符串是否结束。以字符'\0'作为字符串结束标志。'\0'是一个ASCI.

RobinLiu的博客 6042

c语言编程字符串_C编程中的字符串

c语言编程字符串Strings in C programming are an array of characters with a NULL character ('\0') appended at the end index. Unlike character arrays, a c-string is a sequence of characters that are treated by ...

从零开始的教程世界 1356
上一篇: 数据结构(严蔚敏)之二——链表的c语言实现
下一篇: 贪心算法之——过河问题(nyoj47)
君只见独不见
博客等级 码龄12年 99粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值