字符串作为c语言中一种特殊的存在,是一种特殊类型的数组,他的组成元素类型为 char。以’\0’作为结束标志。所以我们不能直接对字符串进行直接的输入与输出。
其中带单引号的称为字符常量,带有双引号的称为字符串常量,字符串常量常常以’\0’作为结束标志,这就意味着我们在c语言中对字符串的使用中往往要注意’\0’这个标志,一旦在字符串中出现’\0’,那么在’\0’后有多少字符,都不会进行后续的输出。('\0’后的字符也不会在计算字符串长度时被计算进去。)
字符的输入与输出
字符的输入
由于在c语言中并没有字符串相关的数据类型,所以我们再进行字符串的输出前需要我们定义一个字符类型的数组,借数组来进行字符串的输入才能实现字符串的输出。字符串的输入有以下几种方法:
%c一字符的形式进行输入
%s以字符串的格式进行输入
-
scanf(“%c”,&ch) ——>输入键盘输入一个字符
scanf(%s",ch)——>输入键盘输入字符串 -
ch = getchar()——>输入键盘输入一个字符
tips:在字符的输入中,空格、换行(\n)、tab(缩进)都是字符,getchar()我们常常用于接走多余字符,或使用%c忽略掉以上字符。
-
gets()——>输入键盘输入的字符串
tips:scanf()与gets()的区别:scanf()时以空格和回车(\n)作为标志结束的,而gets()是以遇到(\n)作为标志结束的。所以如果我们要读入一个带空格符的字符串时因该用gets(), 而不宜用scanf()。
字符的输出
字符的输出与输入一样,有以下几种方法:
- printf(“%c”,ch)——>输出一个字符
printf(“%s”,str)—— > 输出一个字符串 - putchar()——>输出一个字符
- puts()——>输出一个字符串
tips:printf()和puts()的区别:puts()会自动输入(\n),printf()需要手动输入(\n)。
在字符的输入与输出中,由于在c语言中没有字符串的数据类型,所以我们每次都需要在字符的输入输出前定义一个字符型的数组。例如:char str[] = {0};
字符串的处理函数
只要我们需要在代码中实现对字符进行数据处理,那么我们都要在代码的开始引入预命令(头文件):#include <string.h>。
计算字符串长度、
对于字符串所占数据长度的计算有以下三种方式,分别为:
- sizeof()
使用方法:sizeof(str)——其中的str为定义过的字符型数组。
sizeof()不是一个函数,它是一个运算符,作用为计算一个数据类型的大小,他的类型可以是数组、函数、指针、对象等,单位为字节。 - strlen()
使用方法:strlen(字符串/字符串数组)。
strlen()的功能是计算一个指定字符串的长度,由于它是一个函数,所以需要包含头文件(#include <string.h>)。
tips:二者的区别在于
1.sizeof()会将空字符(\0)计算在内,而strlen()不会将空字符(\0)计算在内。
2. sizeof()会计算到字符串的最后一个空字符(\0)才会结束,而strlen()遇到第一个空字符(\0)的话就会停止并计算遇到第一个空字符(\0)前的字符的长度(不包含空字符)。
举例:当定义数组 char str[10]={0};时,不论后来在str数组中输入任何数据,用sizeof(str)我们都会得到10的结果,而strlen(str)会输出我们输入的字符串长度(输入字符低于10的情况)
字符的拼接
当我们需要将输入的两个字符进行拼接组合时,我们可以用到以下两种函数:
- strcat()
使用方法:strcat(目标字符串/字符数组,源字符串/字符数组);
strcat()是将目标字符串的最后一个字符(\n)替换为源字符串的开头第一个字符。 - strncat()
使用方法:strncat(目标字符串/字符数组,源字符串/字符数组,n)
作用是将源字符串/字符数组的前n个字符拼接到目标字符串/字符数组的结尾,并添加\0结束。
tips:strcat()与strncat()都无法进行字符串是否越界进行检查,所以我们在使用过程中应该进行越界判断,防止其溢出。
例子:对字符串拼接时的溢出检查。
#include <stdio.h>
#include <string.h>
//#define n 3
int main(void)
{
char str1[10] = {0};
char str2[10] = {0}; //定义两个字符数组
int n = strlen(str1);
scanf("%s\n",&str1);
scanf("%s\n",&str2);
strcat(str1,str2); //strncat(str1,str2,n)
if(strlen(str2) + 1 > sizeof(str1) )
//if(strlen(str2) + 1 + n > sizeof(str1));
{
printf("str2与str1拼接后的长度溢出\n");
return -1;
}
puts(str1);
printf("str1的长度为:%ld",n);
return 0;
}
字符串的拷贝
当我们需要将一个字符串拷贝到另一个字符串时,我们需要用到以下两个函数:
- strcpy()
使用方法:strcpy(目的字符数组/字符串,源字符数组/字符串);
作用是将源字符数组/字符串中的元素拷贝到目的字符数组/字符串。(将目的字符数组/字符串完全覆盖。同时也将(\0),输入进去,如果输入时’\0’后仍有字符,则’\0’后的字符不会拷贝到目的字符数组/字符串中)。 - strncpy()
使用方法:strncpy(目的字符数组/字符串,源字符数组/字符串);
作用是将源字符数组/字符串的前n个字符拷贝到目的字符数组/字符中(后边带有’\0’)。
tips:strcpy()与strncpy()都无法进行字符串是否越界进行检查,所以我们在使用过程中应该进行越界判断,防止其溢出。
例子:对字符数组进行拷贝时的溢出检查。
#include <stdio.h>
#include <string.h>
//#define n 3
int main(void)
{
char str1[10] = {0};
char str2[100] = {0}; //定义两个字符数组
scanf("%s\n",&str1);
scanf("%s\n",&str2);
strcpy(str1,str2); //strncpy(str1,str2,n);
if(strlen(str2) > sizeof(str1))
//if(n + 1 > sizeof(str1))
{
printf("str2拷贝至str1后的长度溢出\n");
return -1;
}
puts(str1);
printf("str1的长度为:%ld",strlen(str1));
return 0;
}
tips:若想让其输出溢出,那么此时str2数组的元素数量应该设的量大于str1,若没有设置str2的值大于str1,那么数组中元素的个数溢出str2,无法显示结果。
字符串的比较
字符串的比较是比较字符串的大小,比较的是两个字符串从左至右依次比较其ASCII码的大小(与字符串的长短无关),直到出现不同的字符或遇’\0’为止。
在比较字符串的大小时,我们会用到以下两种函数:
- strcmp()
使用方法:strcmp(字符数组1/字符串1,字符数组/字符串2);
判断结果输出值为返回值,我们需要对返回值进行判断:
大于0—>字符串1 > 字符串2
小于0—>字符串1 < 字符串2
等于0—>字符串1 == 字符串2
功能为将字符串2的字符的ASCII码值从左至右依次与字符串2进行比较。直到出现不同的字符或遇’\0’为止。 - strncmp()
使用方法:strncmp(字符数组1/字符串1,字符数组/字符串2,n);判断结果同样为返回值,需要对返回值进行判断。
功能为将字符串2的前n个字符的ASCII码值从左至右依次与字符串2进行比较。直到出现不同的字符或遇’\0’为止。
tips:strcmp()与strncmp()都无法进行字符串是否越界进行检查,所以我们在使用过程中应该进行越界判断,防止其溢出。
例子:对字符数组进行比较时的溢出检查。
#include <stdio.h>
#include <string.h>
//#define n 3
int main(void)
{
char str1[10] = {0};
char str2[100] = {0};//定义两个字符数组
scanf("%s\n",&str1);
scanf("%s\n",&str2);//strncmp(str1,str2,n);
int A = strcmp(str1,str2);//strncmp(str1,str2,n)
if(A > 0)
{
printf("str1 > str2\n");
}
else if(A < 0)
{
printf("str1 < str2\n");
}
else
{
printf("str1 = str2\n");
}
printf("str1的长度为:%ld",strlen(str1));
return 0;
}