c语言------字符串详解(非常详细)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

    字符串是c语言中最有用、最重要的数据类型之一。我们在介绍字符串时
  或多或少的会涉及指针,这是不可避免的。(实际上字符串的大多数操作都
  是通过指针完成的)

一、什么是字符串?

字符串是一个多个字符的序列(包括:数字、字母、空格等)如:
“This is an array of atrings” 要注意:双引号不是字符串的一部分。双引号仅告诉编译器它括起来的是字符串。

二、在程序中定义字符串

  在学习下面知识前我们要先知道,C语言没有专门用于存储字符串的变量类
型,字符串都被存储在char类型的数组中。数组都由连续存储单元组成,字符
串中的字符被存储在相邻的存储单元中,每个存储单元(一字节)存储一个字
符。

1、字符串常量(涉及一些复杂的知识)

双引号括起来的内容称为字符串常量(C语言中不存在字符串变量)。
双引号中的字符和编译器自动加入末尾的**\0**字符,都作为字符串存储在内存中,下面是一些例子:

"Give me a thumbs up"//在定义字符串时编译器会自动在字符串最后加入'\0'字符在下面我们会详细讲解
"Thank you for your support"//

在定义字符串时,字符串常量见没有间隔或用空白字符分割,C语言将会把它们看作串联起来的字符串常量。示例:

char ch1[30] = "Stick"    "to it will ""be something";
printf("ch1  =  %s \n", ch1);
//%s是打印字符串的格式符
char ch2[30] = "Stick to it will be something";
printf("ch2  =  %s \n",ch2);

程序运行结果:
在这里插入图片描述
可以看到上述例子,在进行字符串打印操作时(printf(“ch2 = %s \n”,ch2);),实际参数位置只需要给出数组名,我们知道数组名代表数组首元素地址,也就是数组开始位置,那么下面代码也可以做到相同的效果:

printf("%s \n", "Stick to it will be something");

这是否说明双引号中的内容也是代表首元素的地址呢?下面我们测试一下,代码如下:

	printf("%p   %c\n", "Stick",*"Stick");

代码运行结果:
在这里插入图片描述

  通过%p转换确实打印出了一个地址,我们通过对这个地址的解引用得到了
这个字符串的首元素,证实了上面的猜想。

2.字符串数组和初始化

我们在定义字符串数组时,如果在程序运行前知道要存储内容,就可以开辟足够大的空间用来存储字符串,或是省略数组初始化声明中的大小(编译器会自动计算数组大小,并开辟出足够大的空间)。示例使用“Stick to it will be something”演示:

char ch[40] = "Stick to it will be something";
char ch2[] = "Stick to it will be something";
//如果创建一个稍后再填充的数组,必须在声明时指定大小

值得一提的是,在开辟空间大于字符串所需空间时,空间剩余部分会被初始化为‘\0’。示例:

	char ch[5] = "six";//为方便展示,初始字符串较短
可以看到下方字符串数组内存存储情况,未使用部分全部使用‘\0’初始化

在这里插入图片描述
下面我们再来认识一种不常用的初始化方式,示例如下:

char ch[10] = { 'H','e','l','l','\0' };
printf("%s  ", ch);
//注意这里如果没有空字符('\0')就不是一个字符串,而是一个字符数组
//字符数组不可以用上述形式输出
       我们在指定数组大小时,要确保数组可存储元素个数至少比字符串长
度多1(再次强调编译器编译程序时会在字符串最后添加‘\0’,这也是字符串
结束的标志)

3.数组和指针

       在阅读这块时要注意,下面介绍的只是很浅显的知识,如果非要展开来讲,就会涉及到C语言后面的
   知识(数据存储----程序的内存分配),对于刚接触的同学来说,可能会难以理解。
char ch[10] = "sihio";//数组形式
char* c = "sihio";//指针形式
//下面代码均以这里为例

数组形式:
在进行上述形式存储时,编译器会把数组名ch,当作数组首元素地址(&ch[0])的别名(就像我们给同学起外号一样),在这里我们要清楚,ch是地址常量(常量不可被修改),如果修改了ch也就意味着更改了数组存储的位置,也就是说我们在对数组进行操作时可以进行类似ch+n(n指所有小于数组范围的整数)的操作,但不允许进行类似这样的操作:++ch(大家应该知道自增运算符会改变作用对象大小)。
指针形式:
在程序运行时,它会为c指针变量开辟应该属于它的空间,并把字符串首字符的地址存储在这块空间中,这个指针变量的值是可以改变的,所以它可以使用自增运算的进行++c的操作。

     这里就不演示了,大家可以自己试一下。

数组和指针的区别:
两者的主要区别是:数组名ch是常量,而指针c是变量(这关系到他们使用时的区别)。

      关于字符串,还有很多知识我并没有在这里提到,C语言知识间的联系还是很强的,如果要面面俱
  到,就会涉及到很多其他的知识,不利于理解。字符串在C语言中还是很重要的,下次我会给大家介绍
  C语言专门为操作字符串而定义的函数。
  • 46
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
C语言字符串函数的原型可以在C标准库的string.h头文件中找到。其中一些常用的字符串函数的原型如下: 1. strlen函数的原型是:size_t strlen(const char *str); 这个函数用于计算字符串的长度,返回的是字符串中字符的个数,不包括空字符'\0'。 2. strcpy函数的原型是:char *strcpy(char *dest, const char *src); 这个函数用于将源字符串src复制到目标字符串dest中,并返回目标字符串的指针。 3. strcat函数的原型是:char *strcat(char *dest, const char *src); 这个函数用于将源字符串src追加到目标字符串dest的末尾,并返回目标字符串的指针。 4. strcmp函数的原型是:int strcmp(const char *str1, const char *str2); 这个函数用于比较两个字符串str1和str2的大小关系。如果str1小于str2,则返回一个负数;如果str1等于str2,则返回0;如果str1大于str2,则返回一个正数。 5. strchr函数的原型是:char *strchr(const char *str, int c); 这个函数用于在字符串str中查找字符c的第一次出现,并返回该字符的指针。 这些函数只是C语言字符串函数中的一部分,还有很多其他的字符串函数可以在string.h头文件中找到。 #### 引用[.reference_title] - *1* [C语言字符串函数及如何实现这些函数](https://blog.csdn.net/weixin_29007243/article/details/117020047)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【经典】C语言字符串函数原型](https://blog.csdn.net/sinat_36184075/article/details/69372144)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [字符串查找函数,C语言字符串查找函数详解](https://blog.csdn.net/weixin_35433448/article/details/117013859)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值