在对字符串进行操作的时候,我们常常会用到字符串的相关函数,如strcmp(),strncmp(),strlen(),strcpy(),strncpy(),strcat(),strncat()函数,今天我就针对这些函数,进行使用讲解以及如何自己编写相应的程序来实现其功能。
字符串比较函数:strcmp()&&strncmp()
1. int strcmp(const char *s1, const char *s2)
头文件:string.h
功能:比较字符串(区分大小写)
返回值:若字符串s1和字符串s2相同,则返回0;
若字符串s1大于字符串s2,则返回正数;
若字符串s1小于字符串s2,则返回负数。
注:是使用二进制的方式进行比较,而且字符串大小的比较是一ASCII码值进行比较的,首先s1和s2的第一个字符进行比较,若差值为0则继续比较,否则就讲差值返回。只可用于比较两个字符串常量,或比较数组和字符串常量,不能比较数字等其他形式的参数。
自己编写的实现strcmp()相同功能的函数my_strcmp():
<span style="font-size:18px;"><strong>#include <stdio.h>
int my_strcmp(const char * s1,const char * s2)
{
while(*s1 != '\0')
{
if((*s1 - *s2) == 0)
{
s1 ++;
s2 ++;
}
else
{
if((*s1 - *s2) > 0)
{
return 1;
break;
}
else
{
return -1;
break;
}
}
}
if(*s2 != '\0')
{
return -1;
}
return 0;
}
int main()
{
int res;
char *s1 = "hello";
char *s2 = "hello";
res = my_strcmp(s1,s2);
switch(res)
{
case -1:
printf("s1 < s2\n");
break;
case 0:
printf("s1 = s2\n");
break;
case 1:
printf("s1 > s2\n");
break;
default:
printf("Error!");
}
return 0;
}</strong></span>
上面的函数调试结果为:
s1 = s2
这个程序主函数里进行比较的字符串是我自己设定的,大家也可以自己添加,从scanf录入。
2. int strncmp(const char *s1, const char *s2, size_t n)
头文件:string.h
功能:比较指定比较数目前n个字符串(区分大小写)
返回值:若字符串s1和字符串s2前n个字符相同,则返回0;
若字符串s1前n个字符大于字符串s2前n个字符,则返回正数;
若字符串s1前n个字符小于字符串s2前n个字符,则返回负数。
自己编写的实现strncmp()相同功能的函数my_strncmp():
<span style="font-size:18px;">#include <stdio.h>
int my_strncmp(const char * s1,const char * s2,size_t n)
{
int i;
for(i = 0;i < n;i ++)
{
if(*s1 == *s2)
{
s1 ++;
s2 ++;
}
else
{
if(*s1 > *s2)
{
return 1;
break;
}
else
{
return -1;
break;
}
}
}
return 0;
}
int main()
{
int res;
int n = 2;
char *s1 = "hi!";
char *s2 = "hello world!";
res = my_strncmp(s1,s2,n);
switch(res)
{
case -1:
printf("s1 < s2.\n");
break;
case 0:
printf("s1 = s2.\n");
break;
case 1:
printf("s1 > s2.\n");
break;
default:
printf("Error!");
}
return 0;
}</span>
调试结果如下:
s1 > s2.
字符串拷贝函数:strcpy()&&strcncpy()
1.char *strcpy(char *dest,const char *src)
头文件:string.h
功能:把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间.
返回值:char * 类型,即指向dest的指针。
注:src和dest所指向的内存地址不可以重叠,且dest要有足够的空间来存放src的字符串。
自己编写函数my_strcpy()以实现跟strcpy()相同的函数功能:
#include <stdio.h>
char *my_strcpy(char *dest,char *src)
{
char *temp = dest;
while(*src != '\0')
{
*temp = *src;
temp ++;
src ++;
}
*temp = '\0';
return dest;
}
int main()
{
char dest[20] = "hello world!";
char src[20] = "hi!";
char *res = my_strcpy(dest,src);
printf("The copied string is:%s\n",res);
return 0;
}
调试结果为:
The copied string is:hi!
2.char *strncpy(char *dest, const char *src, size_t n)
头文件:string.h
功能:把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中
返回值:dest
自己编写程序my_strncpy()以实现与strncpy()相同的函数功能:
#include <stdio.h>
#define MAX_SIZE 1024
char * my_strncpy(char * dest,char * src,size_t n)
{
int i;
char *temp = dest;
for(i = 0;i < n; i ++)
{
*temp = *src;
temp ++;
src ++;
}
return dest;
}
int main()
{
int n = 3;
char dest[MAX_SIZE] = "hi Nancy!";
char src[MAX_SIZE] = "hello world!";
char *res = my_strncpy(dest,src,n);
printf("The copied string is:%s\n",dest);
return 0;
}
调试结果为:
The copied string is:helNancy!
strcpy()只是复制字符串,但不限制复制的数量,很容易造成缓冲溢出,而strncpy()则相对安全一点。
strncpy()能够选择一段字符输出,strcpy()不能。
字符串长度函数:strlen()
size_t strlen(const char *s)
头文件:string.h
功能:计算字符串的长度
返回值:字符串的长度
注:字符串长度不包括结束符'\0'。
自己编写my_strlen()函数以实现strlen()的相应的功能;
#include <stdio.h>
#define MAX_SIZE 1024
size_t my_strlen(const char *src)
{
int len = 0;
while(*src != '\0')
{
len ++;
src ++;
}
return len;
}
int main()
{
int len;
char src[MAX_SIZE] = "hello world!";
len = my_strlen(src);
printf("The lenght of the string is:%d.\n",len);
return 0;
}
调试结果为:
The lenght of the string is:12.
字符串连接函数:strcat() && strncat()
1.char *strcat(char *dest,const char *src)
头文件:string.h
功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')。
返回值:连接后的字符串dest。
自己编写的my_strcat()函数以实现strcat()的功能:
#include <stdio.h>
#define MAX_SIZE 1024
char *my_strcat(char *dest,char *src)
{
char *temp = dest;
while(*temp != '\0')
{
temp ++;
}
while(*src != '\0')
{
*temp = *src;
temp ++;
src ++;
}
return dest;
}
int main()
{
char dest[MAX_SIZE] = "hello world!";
char src[MAX_SIZE] = "hi!";
char *res = my_strcat(dest,src);
printf("The linked string is:%s\n",dest);
return 0;
}
调试结果为:
The linked string is:hello world!hi!
2.char *strncat(char *dest,const char *src,size_t n)
头文件:string.h
功能:把src所指字符串的前n个字符添加到dest结尾处(覆盖dest结尾处的'\0'),再追加'\0'。
返回值:指向dest的指针。
自己编写的my_strncat()函数以实现strncat()的功能:
#include <stdio.h>
#define MAX_SIZE 1024
char * my_strncat(char *dest,char *src,size_t n)
{
int i;
char *temp = dest;
while(*temp != '\0')
{
temp ++;
}
for(i = 0;i < n;i ++)
{
*temp = *src;
temp ++;
src ++;
}
*temp = '\0';
return dest;
}
int main()
{
int n = 4;
char dest[MAX_SIZE] = "hello world!";
char src[MAX_SIZE] = "hi Nancy!";
char *res = my_strncat(dest,src,n);
printf("The linked string is:%s\n",dest);
return 0;
}
调试结果为:
The linked string is:hello world!hi N