C语言——数组、字符串处理函数、strlen、strcpy和strncpy、strcat和strncat、strcmp和strncmp
目录
一、数组
1.定义:类型 数组名[元素个数]
2.数组不能动态定义
3.如何访问数组中的元素:数组名[下标]
4.循环与数组的关系
5.数组的初始化
二、C99标准中的数组
三、字符串处理函数
1.字符数组
2.获取字符串的长度:strlen
(1)函数概要
(2)函数原型
3.拷贝字符串:strcpy和strncpy
4.连接字符串:strcat和strncat
5.比较字符串:strcmp和strncmp
一、数组
1.定义:类型 数组名[元素个数]
- int a[6];
- char b[24];
- double c[3];
思考:上述几个类型,占用多少个字节的内存?
分别如下:
2.数组不能动态定义
3.如何访问数组中的元素:数组名[下标]
- a[0];// 访问a数组中的第一个元素
- b[1];// 访问a数组中的第二个元素
- c[5];// 访问a数组中的第六个元素
注意:
- int a[5];// 创建一个具有五个元素的数组
- a[0];// 访问第一个元素的下标是0,不是1
- a[5];// 报错,因为第五个元素的下标是a[4]
4.循环与数组的关系
举个栗子:实现一个执行10次的循环,通常是这么写:
for(i = 0; i < 10; i++)
{……
}
而不是这样:
for(i = 1; i <= 10; i++)
{……
}
这是因为我们常常需要用循环来访问数组:
int a[10];
for(i = 0; i < 10; i++)
{a[i] = i;
}
代码实战:尝试使用数组存放10位同学的数学成绩,并计算出平均数
#include <stdio.h>
#define NUM 10int main()
{int s[NUM];int i,sum = 0;for(i = 0;i < 10; i++){printf("请输入第%i位同学的成绩:",i + 1);scanf("%d",&s[i]); sum += s[i];}printf("成绩录入完毕,该次考试的平均分是:%.2f\n",(double)sum / NUM);return 0;
}
运行结果:
5.数组的初始化
- 将数组中所有元素初始化为0:
int a[10] = {0};// 事实上这里只是将第一个元素赋值为0
代码举例:
#include <stdio.h>int main()
{int a[10] = {0};int i;for(i = 0; i < 10; i++){printf("%d\n",a[i]);}return 0;}
运行结果:
- 如果是赋予不同的值,则用逗号分隔开:
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
代码举例:
#include <stdio.h>int main()
{int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};int i;for(i = 0; i < 10; i++){printf("%d\n",a[i]);}return 0;}
运行结果:
- 还可以只给一部分元素赋值,未被赋值的元素自动初始化为0:
int a[10] = {1, 2, 3, 4, 5, 6}; //表示前面6个元素赋值,后面4个元素系统自动初始化为0
代码举例:
#include <stdio.h>int main()
{int a[10] = {1, 2, 3, 4, 5, 6};int i;for(i = 0; i < 10; i++){printf("%d\n",a[i]);}return 0;}
运行结果:
- 有时也可只给出各个元素的值,而不指定数组的长度(因为编译器会根据值的个数自动判断数组的长度):
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
代码举例:
#include <stdio.h>int main()
{int a[] = {1, 2, 3, 4, 5, 6};int i;for(i = 0; i < 10; i++){printf("%d\n",a[i]);}return 0;}
运行结果:
- C99增加了一种新特性:指定初始化的元素。这样就可以只对数组中的某些指定元素进行初始化赋值,而未被赋值的元素自动初始化为0:
int a[10] = { [3] = 3, [5] = 5,[8] = 8 };
代码举例:
#include <stdio.h>int main()
{int a[10] = { [3] = 3, [5] = 5,[8] = 8};int i;for(i = 0; i < 10; i++){printf("%d\n",a[i]);}return 0;}
运行结果:
补充:sizeof
- 计算占用空间的大小
- 若后边写的是数组名,则计算数组占用的内存的大小
代码举例:
#include <stdio.h>int main()
{int a[10] = { [3] = 3, [5] = 5,[8] = 8};int i;for(i = 0; i < 10; i++){printf("%d\n",a[i]);}printf("%d\n",sizeof(a));return 0;}
运行结果:
二、C99标准中的数组
数组的尺寸如果是整型常量或者整型常量表达式时,或确定其尺寸时,数组的类型就不是一个可变长度的数组;否则它就是可变长度的数组。也就是说,在C99标准时,C语言已经支持可变数组了。
注意:这里说的可变长度或者变长数组指的是数组的长度在运行时才被决定,即用变量来指定数组的长度。
代码举例1:
#include <stdio.h>int main()
{int n,i;printf("请输入字符的个数:");scanf("%d",&n);char a[n+1]; printf("请开始输入字符:");getchar();for(i = 0;i < n;i++) {scanf("%c",&a[i]);}a[n] = '\0';printf("你输入的字符串是:%s",a);return 0;
}
运行结果:
代码举例2:
#include <stdio.h>int main()
{int a[10],i;for(i = 0;i <= 10; i++)//此处为试错操作,开发中尽量不要出现=号,可能会出现数组越界问题 {a[i] = i; }for(i = 0;i <= 10;i++){printf("%d\n",a[i]);}return 0;}
运行结果:
三、字符串处理函数
1.字符数组
- 字符串常量:“FishC”,“小甲鱼”,“鱼C工作室”
- 字符数组:
2.获取字符串的长度:strlen
(1)函数概要
- strlen函数用于返回指定字符串的长度。
- C语言字符串的长度取决于结束符('\0')的位置。
- 一个字符串的长度指的是从起始位置到结束符的字符个数(不包含结束符本身)。
注意:不要混消字符串的长度和字符串数组的大小。
(2)函数原型
#include <string.h>
…
size_t strlen(const char * str );
返回值:
- 如果该函数调用成功,返回值是指定字符串的长度(字符个数,不包含结束符 '\0' )。
注意: size_t 被定义于 stddef.h 头文件中,它事实上就是无符号整形(unsigned int)
代码举例:
#include <stdio.h>
#include <string.h>int main()
{char str[] = "I love C!";printf("sizeof str = %d\n",sizeof(str));printf("strlen str = %u\n",strlen(str));return 0;}
运行结果:
3.拷贝字符串:strcpy和strncpy
(1)strcpy
使用此函数一定要保证目标字符串(目标字符数组)的长度要足以容纳源字符串(源数组)。否则,会出现问题(但不报错)。
代码举例:
#include <stdio.h>
#include <string.h>int main()
{char str1[] = "Original String";char str2[] = "New String";char str3[100];strcpy(str1,str2);//① strcpy(str3,"Copy Successful");printf("str1:%s\n",str1);printf("str2:%s\n",str2);printf("str3:%s\n",str3);return 0;
}
运行结果:
若将上述代码①处改为:strcpy(str2,str1); 则会有问题产生。因此在程序实现拷贝的时候,应该限制源字符串的长度,确保目标字符串在执行完拷贝之后不会发生溢出。此时即可使用strncpy。
(2)strncpy
①函数概要
和 strcpy 函数一样,strncpy 函数将拷贝源字符串的 n 个字符到目标数组中,如果源字符串的长度小于 n,那么就用 '\0' 填充额外的空间。如果源字符串的长度大于或等于 n,那么只有 n 个字符被拷贝到目标数组中(注意:这样的话将不会以结束符 '\0' 结尾)。
- 为了使该函数更“安全”,建议使用 dest[n-1] = '\0';语句确保目标字符串是以 '\0' 结尾。
- 源字符串和目标数姐的位置不应该重叠。
代码举例:
#include <stdio.h>
#include <string.h>int main()
{char str1[] = "To be or not to be";char str2[40];strncpy(str2, str1, 5);//参数5用于限制拷贝的长度str2[5] = '\0';//①printf("str2:%s\n",str2);return 0;}
运行结果:
4.连接字符串:strcat和strncat
要求目标数组中已经包含一个字符串(可以是空字符串),它会找到该字符串的末尾,并将源字符串连接过去。
代码举例:
#include <stdio.h>
#include <string.h>int main()
{char str1[] = "I love";char str2[] = "C!";strcat(str1, " ");strcat(str1,str2);printf("str1: %s\n",str1);return 0;}
运行结果:
注意:strncat与strncpy不同,它总是在连接后面会自动加一个结束符 '\0' ,
5.比较字符串:strcmp和strncmp
(1)strcmp
- 用来比较两个字符串是否完全一致,若一致,则返回值为0;否则,则根据情况返回大于0或小于0的值
- 原理:从第一个字符串开始依次对比两个字符串每个字符的ASCII码,如果第一个字符串的ASCII码小于第二个字符串对应的字符,则返回一个小于0的值;如果第一个字符串的ASCII码大于第二个字符串对应的字符,则返回一个大于0的值。
代码举例:
#include <stdio.h>
#include <string.h>int main()
{char str1[] = "FishC.com!";//①char str2[] = "FishC.com!";if(!strcmp(str1,str2)){printf("两个字符串完全一致!\n");}else{printf("两个字符串存在差异!\n");}return 0;}
运行结果:
若将上述代码①出的大写C 改为 小写c,则运行结果如下:
(2)strncmp
- 增加一个参数n用于指定只对比前面的n个字符
C语言——数组、字符串处理函数、strlen、strcpy和strncpy、strcat和strncat、strcmp和strncmp相关推荐
- 【C语言】字符串拷贝函数(strcpy)与内存拷贝函数的不同及内存拷贝函数(memcpy)的模拟实现
目录 字符串拷贝函数(strcpy) 函数原型 应用实例 我们将一个存放"abcdefg"的字符数组arr的内容拷贝到字符数组brr之中. 缺点 内存拷贝函数(memcpy) 函数 ...
- 《C语言杂记》理解字符串处理函数 strlen() strcpy() strcat() strcmp()
在linux C 编程中,我们经常遇到字符串的处理,最多的就是字符串的长度.拷贝字符串.比较字符串等:当然现在的C库中为我们提供了很多字符串处理函数.熟练的运用这些函数,可以减少编程工作量,这里介绍几 ...
- 字符串处理函数(strcpy strcat strcmp strlen)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.字符串复制函数 strcpy 二.字符串连接函数 strcat 三.字符串比较函数strcmp 四..求字符串长度 ...
- C语言程序设计——从键盘任意输入一个字符串(可以包含:字母、数字、标点符号,以及空格字符),计算其实际字符个数并打印输出,即不使用字符串处理函数strlen()编程,但能实现strlen()的功能。
从键盘任意输入一个字符串(可以包含:字母.数字.标点符号,以及空格字符),计算其实际字符个数并打印输出,即不使用字符串处理函数strlen()编程,但能实现strlen()的功能. 程序运行示例: P ...
- C语言使用字符串处理函数
1.puts函数--输出字符串的函数. 一般形式为: puts(字符数组) 作用:将一个字符串(以'\0'结束的字符序列)输出终端.假如已定义str是一个字符数组名,且该数组已被初始化为"C ...
- php获取字符串长度函数strlen和mb_strlen
php获取字符串长度函数strlen和mb_strlen count() - 计算数组中的单元数目,或对象中的属性个数 strlen - 获取字符串长度,一个汉字为3个字符 mb_strlen() - ...
- 字符串拷贝函数:strcpy的详解及模拟实现
字符串拷贝函数:strcpy的详解及模拟实现!!! 对于字符串拷贝函数,之前在学习字符串时候,就已经学习过,但那只是片面的学习了一下,并没有经过系统的分析!只是大概的学习了一下!在关键的地方有时候还不 ...
- 探索C语言之字符串分割函数:strtok和strsep的区别
探索C语言之字符串分割函数:strtok和strsep的区别 概述 strsep - extract token from string(linux 下) strtok, strtok_r - ext ...
- sort函数排序字母c语言,c语言数组用sort函数排序?
c语言运用sort 排序函数,需要的头文件是什么? sort不属于C语言的标准函数,所以也没有相应的头文件,但是可以自定义. sort 函数为将整型数组从小到大排序. voidsort(int*a,i ...
- C语言常用字符串操作函数大全详解(strstr,strtok,strrchr,strcat,strcmp,strcpy,strerror,strspn,strchr等)
参考:string.h中常用字符串操作函数说明(strstr,strtok,strrchr,strcat,strcmp,strcpy,strerror,strspn,strchr等) 作者:一只青木呀 ...
最新文章
- linux下使用sort命令升序、降序、随机及组合方式排序方法
- Visual Studio 15改进C++工程加载
- mysql 连接 优化_(一)MySQL 连接优化
- 《大话设计模式》第29章-OOTV杯超级模式大赛—模式总结(四)
- [网络安全自学篇] 八十一.WHUCTF之WEB类解题思路WP(文件上传漏洞、冰蝎蚁剑、反序列化phar)
- java 控制jsp_JSP学习之Java Web中的安全控制实例详解
- 32命令模式(Command Pattern)
- 数组——询问学号(洛谷 P3156)
- ras的c语言源代码文档,µMore(µITRON操作系统)--功能概况
- LeetCode简单题目(#263 #268 #278 #283 #290)-5道(数字、字符串)
- html调用python_HTML网页调用本地Python程序
- 如何用 Lua 查询青云的主机
- 3d max插件的基本知识和安装方法
- cad灯具图标_CAD图纸灯具图例
- 锐起无盘找不到服务器,锐起无盘出现重启后连接不到服务器
- php中的gd图像处理,PHP图像处理(GD库)
- Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.
- mysql 加号_从数据库中读取字符串时其中的空格变成加号
- 测试开发之路-我的处女作
- Golang-Beego(go mod)