第一章 初识C语言
第二章 变量
第三章 常量
第四章 字符串与转义字符
第五章 数组
第六章 操作符
第七章 指针
第八章 结构体
第九章 控制语句之条件语句
第十章 控制语句之循环语句
第十一章 控制语句之转向语句
第十二章 函数基础
第十三章 函数进阶(一)(嵌套使用与链式访问)
第十四章 函数进阶(二)(函数递归)
第十五章 数组进阶
第十六章 操作符(详解及注意事项)
第十七章 指针进阶(1)
第十八章 指针进阶(2)
第十九章 指针进阶(3)
第二十章 指针进阶(4)
第二十一章 数据的存储(秒懂原、反、补码)
第二十二章 指针和数组笔试题详解(1)
第二十三章 指针和数组笔试题详解(2)
第二十四章 字符串函数(1)
第二十五章 字符串函数(2)
本章将继续讲解剩余的与字符串相关的常用库函数,希望对大家有所帮助。
我们第一眼看到这个函数的时候,我们会发现在函数的名称上,这个函数和strcpy是非常相似的。除了函数名,这两个函数的作用也很相似。只是strcpy是将整个字符串复制给目标空间,而strncpy是将源字符串中的n个字符复制给目标空间。
形参列表中多出来的num其实就是我们在使用的时候所指定的n个字符。
int main()
{
char str1[]="aaaaaaaaaaa";
char str2[]="xxxxxxxxxx";
printf("%s\n",strncpy(str1,str2,3));
return 0;
}
这个函数的作用就是将源字符串中的n个字符,附加到目标字符串的后面。
int main()
{
char str1[20]="aaaa";
char str2[]="xxxxxxxxx";
printf("%s\n",strncat(str1,str2,4));
return 0;
}
strncmp函数的作用就是将两个字符串中的前n个字符进行比较,最终返回一个比较的结果。这里需要注意的是,当函数将两个字符串中的字符进行依次逐一比较的时候,当出现了差别时,就会返回对应的结果。或者当前n个字符的比较上,两个字符串都是相等的,此时就返回相等。
int main()
{
char str1[20]="aaaaaaaaaaa";
char str2[]="xxxxx";
printf("%s",strncmp(str1,str2,3));
return 0;
}
strstr函数的作用就是在一个str1字符串中寻找str2字符串,并返回str2字符串在str1中第一次出现的位置的首元素地址,倘若没找到,则返回一个空指针。
int main()
{
char str1[] = "abcdefgh";
char str2[] = "cde";
char* ret = strstr(str1, str2);
if (ret != NULL)
{
printf("已经找到字符串。%s\n", ret);
}
else
{
printf("未找到该字符串!\n");
}
return 0;
}
我们传入了两个图中所示的黑色指针,我们对两个指针所指的地方进行访问,如果二者的内容相等,那么就让蓝色的指针向后偏移,比较后面的字符串是否相等。如果相等,返回对应的黑色指针,如果不相等,就让黑色指针继续偏移,直到二者对应的空间数据相等。
char* my_strstr(const char* str1, const char* str2)
{
assert(*str1!='\0');
assert(*str2!='\0');
while (*str1 != '\0')
{
while (*str1 != *str2)
{
str1++;
}
int count = 0;
char* p1 = str1;
char* p2 = str2;
for (int i = 0; i < strlen(str2); i++, p2++, p1++)
{
if (*p1 == *p2)
{
count++;
}
}
if (count == strlen(str2))
{
return str1;
}
str1++;
}
return NULL;
}
int main()
{
char str1[] = "abcdefg";
char str2[] = "bcd";
printf("%s\n", my_strstr(str1, str2));
}
上述的代码就是将刚才所展示图解思路进行了翻译。如果能够在str1中找到str2的话,那么str1和str2的首元素必定是相同的。在二者首元素相同的条件下,我们再去比较剩余的元素。
所以我们利用str1和str2两个字符串指针去比较首元素。然后我们利用p1和p2向后偏移strlen(str2)
次,去比较二者剩余的字符是否相等。同时我们创建一个整型变量int count
来记录二者后面相同的元素个数。如果相同的元素个数等于strlen(str2)的长度,就说明在str1中找到了str2在字符串。所以这个时候,我们直接返回此时的str1,这样我们就得到了str2数组的首元素在str1中的地址。
想要了解这个函数的作用,我们可以先看一下下面这个例子:
比如我们写了一个邮箱,这个邮箱的地址为:[email protected]。我们想将这个地址分成三部分,xxxxxxx,163,com。这个时候我们就需要用到strtok函数。
所以这个函数的作用就是利用一个字符串中的字符去截取部分字符串。当在某个字符串中找到了需要截取位置的字符,这个函数就会将这个字符改成\0
。
在理解了这个函数作用后,我们来分析一下这个函数的形参列表。列表中共有两个形参,其中一个是被截取的字符串,另外一个由截取位置的字符组成的集合。
这个函数的返回值类型是一个字符指针。那么我们返回的内容肯定是一个字符串的首元素地址。比如我们截取了163这个字符串,此时返回值就是字符1所对的地址。
注意事项:
#include
#include
int main()
{
char str1[] = "[email protected]";
char str1_[200]={0};
strcpy(str1_,str1);
char str2[] = "@.";
char* ret = 0;
ret = strtok(str1_, str2);
printf("%s\n", ret);
ret = strtok(NULL, str2);
printf("%s\n", ret);
ret = strtok(NULL, str2);
printf("%s\n", ret);
return 0;
}
但是我们发现上述的代码过于笨重,我们可以将上述代码改写成循环的方式:
#include
#include
int main()
{
char str1[] = "[email protected]";
char str2[] = "@.";
char str1_[200] = { 0 };
strcpy(str1_, str1);
for (char* ret = strtok(str1_, str2); ret != NULL; ret = strtok(NULL, str2))
{
printf("%s\n", ret);
}
return 0;
}
这个函数的作用其实很简单,就是将一个错误码翻译成对应的错误原因,然后将这个错误原因包装成一个字符串,接着返回这个字符串的首元素地址。
#include
#include
int main()
{
printf("%s\n",strerror(1));
printf("%s\n",strerror(2));
printf("%s\n",strerror(3));
printf("%s\n",strerror(4));
return 0;
}
#include
#include
#include
int main()
{
FILE* pf = fopen("code.txt", "r");//利用一个函数开一个文件,并用一个FILE类型的指针接受返回值,如果打开失败了,那么就会返回一个空指针。并且将错误码记录在一个变量类型为errno的数据类型中。
if (pf == NULL)
{
printf("%s\n", strerror(errno));//利用errno和strerror函数打印错误信息
}
fclose(pf);//利用函数和指针关闭文件
pf = NULL;//将指针重置为空指针
return 0;
}
函数 | 如果他的参数符合下列条件就返回真 |
---|---|
iscntrl | 任何控制字符 |
isspace | 空白字符:空格‘ ’,换页‘\f’,换行’\n’,回车‘\r’,制表符’\t’或者垂直制表符’\v’ |
isdigit | 十进制数字 0~9 |
isxdigit | 十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A ~ F |
islower | 小写字母a~z |
isupper | 大写字母A~Z |
isalpha | 字母a~z或A ~ Z |
isalnum | 字母或者数字,a ~ z,A ~ Z,0~9 |
ispunct | 标点符号,任何不属于数字或者字母的图形字符(可打印) |
isgraph | 任何图形字符 |
isprint | 任何可打印字符,包括图形字符和空白字符 |
函数 | 作用 |
---|---|
toupper | 将小写字母转换为大写字母 |
tolower | 将大写字母转化成小写字母 |
“好的冰球运动员滑到冰球在的地方,而伟大的冰球运动员则滑到冰球将会出现的地方。”
——史蒂夫·鲍尔默