目录
访问字符串中的字符
假如自定义一个函数来访问,可以不需要在设置第二个参数来指明字符串的长度,而采取在函数体中规定 遇到"\0"结束访问。
//1.统计字符串中空格的数量
int count_spaces(const char s[])
{
int count = 0;
for (int i = 0; i < count; i++)
{
if (s[i] == ' ')
{
count ++;
}
return count;
}
}
//2.改进版,更有效、更方便,指针算术运算代替数组取下标
//不再需要i,而是利用s自身来追踪字符串中的位置。
int count_spaces(const char s[])
{
int count = 0;
for (; *s !='\0'; s++)
{
if (*s == ' ')
{
count ++;
}
return count;
}
}
(回顾之前的内容,编译器会把数组形式的形参视为指针。所以字符串形参声明为数组或者指针没有任何差异。)
使用C语言的字符串库
一些编程语言提供的运算符可以对字符串进行复制、比较、拼接、选择子串等操作,但是C语言的运算符无法操作字符串。直接复制或者比较字符串会失败。
例如:
char str1[10],str[10];
str1 = "abc";//错误!将数组名用作=的左操作数是非法操作
//初始化的时候是合法的:char str1[10] = "abc";
if(str1 == str2)//错误!这里会当成两个指针来比较大小,会比较两个地址,所以不可能相等
可以使用字符串库来满足我们的需求。
#include <string.h>
接下来的函数都存在在该库中,因此要使用时,都要添加“#include <string.h> ”头文件
常见函数:
strcpy():复制字符串
strncpy():复制指定长度的字符串
strcat(): 追加字符串
strlen():获取字符串长度(包含'\0')
strnlen():获取字符串长度(不包含'\0')
strcmp():比较字符串
strncmp():比较指定长度字符串
strchr():在字符串中查找指定字符首次出现的位置
strrchr():在字符串中指定字符最后一次出现的位置
strstr():在字符串中查找子串
等等…
查询库函数:Reference - C++ Reference
常用:
strcpy函数
char *strcpy(char *str1, const char *str2) //把 str2 所指向的字符串复制到 str1。
在这里,strcpy函数的作用是把空字符作为str2字符串的结束符,然后把str2字符串复制到str1,且返回值的类型为“char*”。
但是更贴切的说法是覆盖,执行strcpy函数后,str1里存储的是str2的内容。
但是如果数组 str1 不够大,可能会造成缓冲溢出的情况。
#include <stdio.h>
#include <string.h>
int main(void){
char str1[20] = "Hello";
char str2[6] = "World";
strcpy(str1, str2);
printf("复制后的字符串:%s\n",str1);
return 0;
}
//输出结果:复制后的字符串:world
//看来是覆盖
可以使用strcopy函数解决str1 = "abc";//错误!将数组名用作=的左操作数是非法操作 的问题:strcopy(str1,"abc");
strcopy函数的缺点:不会去检查str2的长度,有可能复制回来造成不可预估的后果。
改进:使用strncopy函数,会有第三个参数来限制所复制的长度。
用法:strncopy(str1,str2,sizeof(str1));
这样可以限制str1的长度,是str2装不下也不会往后越界。但是,str1一旦装满,就可能最后一个不是空字符了
改进:再加一行
用法:strncopy(str1,str2,sizeof(str1)-1);
str1[sizeof(str1)-1] = '\0';//手动添加空字符。
strlen函数
函数原型:size_t strlen( const char *string );
遇到\0就会停止下来,不计算空字符后的长度。
#include <stdio.h>
#include <string.h>
int main(void )
{
char str[30] = "Hello World!" ;
printf(" str = %s strlen(str) = %ld \n",str,strlen(str));
return 0 ;
}
#include <stdio.h>
#include <string.h>
int main()
{
char test[50];
int i = 0;
printf(" test[] = ");
for (; i < 26; i++) {
test[i] = 'A' + i;
printf(" %c ",test[i]);
}
printf("\n stelen(test) = %ld \r\n",strlen(test));
return 0 ;
}
strcat函数
函数原型:char * strcat ( char * str1, const char * str2 );
作用:把str2的内容追加到str1的末尾,并返回字符串str1。
实现模式是将str2中的所有字符(连同字符串最后的’\0’一起)加到str1字符串中第一个‘\0’的位置,也就是将str1中第一个’\0’替换成src的第一个字符。
使用起来和strcopy一样。只是结果不同而已。
strcmp函数
strcmp函数是字符串比较函数
函数原型:int strcmp(char *str1,char *str2)
作用:比较字符串str1和str2是否相同,如果相同则返回0,如果不同,前者大于后者则返回1,否则返回-1。
注意:空格符在ASCII码中的位置是32,A~Z是65~90,a~z是97~122。所以空格符小于所以打印字符。