目录
1.strncpy
2.strncat
3.strncmp
4.strstr
5.strchr
6.strtok
7.strerror
1.strncpy
ok,在上一篇博客的讲解中,我们谈到了strcpy这个函数,并且了解到了这个函数的功能是将源字符串的内容复制到目标字符串里,并且我们还知道了在C语言的标准中,strcpy是不允许内容重叠的,所以说,strcpy这个函数也就存在了一定的风险,因此,我们这里出现了一个新的函数来尽量的抵消这个风险。
先来看一下strncpy这个函数的声明
再来对比一下strcpy的声明
对比之下我们发现strncpy多了一个参数,其实这个参数的意思是复制元素的个数,下面我们用几个栗子来看一下这个函数的具体用法
int main()
{
char ch[20] = "azaz_plus";
char ch1[] = "plus_azaz";
strncpy(ch, ch1, 4);
printf("%s\n",ch);
return 0;
}
int main()
{
char ch[20] = "azaz_plus";
char ch1[] = "plus";
strncpy(ch, ch1, 6);
printf("%s\n",ch);
return 0;
}
这是为啥呢,其实是因为如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。追加的0也就是\0
所以说这个函数的作用是从源字符串处复制n个字符到目标字符串。
关于这个函数的实现,大家可以在上一篇博客的基础上自行改进,这个很简单我就不再实现了。
2.strncat
Ok,在了解完上一个函数之后,想必,这个函数的作用大家也能猜出来。其实他的左右就是从源字符串向目标字符串处。
先来看一下定义
下面,我们通过几个栗子来展示一下这个函数的具体用法
int main()
{
char ch[20] = "azaz_plus";
char ch1[] = "plus";
strncat(ch, ch1, 4);
printf("%s\n",ch);
return 0;
}
int main()
{
char ch[20] = "azaz_plus";
char ch1[] = "plus";
strncat(ch, ch1, 6);
printf("%s\n%d\n",ch,strlen(ch));
return 0;
}
通过这个栗子,说明了strncat这个函数在遇到\0之后就会停止。
3.strncmp
在经过上面的学习之后,相比,这个函数大家也一定差不多了解了他的含义,话不多说,我们先来看声明
我们还是通过几个栗子,来让大家自己体会一下这个函数
int main()
{
char ch[20] = "azaz_plus";
char ch1[] = "aabz_plus";
char ch2[] = "azaz";
if (strncmp(ch, ch1, 1)==0)
{
printf("same1\n");
}
if (strncmp(ch, ch1, 2) > 0)
{
printf("ch1>ch\n");
}
if (strncmp(ch2, ch, 4) == 0)
{
printf("same2\n");
}
if (strncmp(ch2, ch, 6) == 0)
{
printf("same3\n");
}
return 0;
}
4.strstr
好的,下面我们来看这个函数,闲来看他的声明,
char * strstr ( const char *str1, const char * str2);
这个函数的作用其实是,在str1中寻找str2这个字符串,如果找到了,就返回第一个所找到位置的指针,如果找不到,就返回NULL。
我们还是用一个栗子来看一下
int main()
{
char str[] = "This is a simple string";
char* pch;
pch = strstr(str, "simple");
puts(str);
printf("\n%s\n", pch);
return 0;
}
通过这个栗子,我们不难发现,这个函数返回的是找到后第一个位置的指针。
5.strchr
上一个函数是在一个字符串中查找字符串,这一个是在一个字符串中查找一个字符。
我们还是先来看一下声明
char * strchr ( const char * str, int character );
哎嗨?后面的值为啥是一个int???
其实就是char类型的本质就是int类型,其实很简单,这里用的是字符的 ASCII 码(因为每个字符都对应着一个 ASCII 码),这样在传值的时候既可以传“char”类型的值,又可以传“int”类型的值(0~127)。
下面我们来看一个栗子
int main()
{
char str[] = "This is a sample string";
char* pch;
printf("Looking for the 's' character in \"%s\"...\n", str);
pch = strchr(str, 's');
while (pch != NULL)
{
printf("found at %d\n", pch - str + 1);
pch = strchr(pch + 1, 's');
}
return 0;
}
很明显,这里我们就不再提了。
6.strtok
然后我们来看这个函数,先来看声明
首先我们要了解一下几点
1.delimiters参数是个字符串,定义了用作分隔符的字符集合
2.第一个参数指定一个字符串,它包含了 0 个或者多个由 sep 字符串中一个或者多个分隔符分割的标记3. strtok 函数找到 str 中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针(注strtok函数会改变被操作的字符串,所以在使用 strtok 函数切分的字符串一般都是临时拷贝的内容并且可修改。)4. strtok 函数的第一个参数不为 NULL ,函数将找到 str 中第一个标记, strtok 函数将保存它在字符串 中的位置。5. strtok 函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标 记。6.如果字符串中不存在更多的标记,则返回 NULL 指针。
然后我们就可以通过栗子来切实的感受一下这个代码
int main()
{
char str[] = "- This, a sample string.";
char* pch;
printf("Splitting string \"%s\" into tokens:\n", str);
pch = strtok(str, " ,.-");
while (pch != NULL)
{
printf("%s\n", pch);
pch = strtok(NULL, " ,.-");
}
return 0;
}
int main()
{
char* p = "azaz_plus@nbnb.com";
const char* sep = ".@";
char arr[30];
char* str = NULL;
strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容
for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
{
printf("%s\n", str);
}
return 0;
}
7.strerror
好的,我们现在来看这最后一个函数
其实他的作用是返回错误码,所对应的错误信息。
C语言在发生错误的时候会将错误代码存储到errno这个整形变量里,这个变量需要包含头文件errno.h,我们不妨暂时来看一个栗子,后续我们会讲解到这个栗子中的知识,所以现在不会的不必担心
int main ()
{
FILE * pFile;
pFile = fopen ("unexist.ent","r");
if (pFile == NULL)
printf ("Error opening file unexist.ent: %s\n",strerror(errno));
return 0;
}
与这个类似的还有一个函数叫perror
这个函数的作用其实就是打印错误
int main ()
{
FILE * pFile;
pFile=fopen ("unexist.ent","rb");
if (pFile==NULL)
perror ("The following error occurred");
else
fclose (pFile);
return 0;
}
ok,今天就到这里,我们下次再见。