本篇主要实现strncpy、strncat、strncmp
strncpy函数
功能:
复制字符串中的字符
将source的前num个字符复制到destination。如果在复制num个字符之前找到了源 C字符串的末尾(由空字符表示),则将目标填充为零,直到总共写入了num个字符为止。如果source大于num,则不会 在目标末尾隐式附加空字符。因此,在这种情况下,目的地不应被视为以空终止的C字符串(这样读取它会溢出)。目的地和源不得重叠。
声明:
官方给出函数声明:char * strncpy ( char * destination, const char * source, size_t num );
destination: 指向要在其中复制内容的目标数组的指针。
source: 要复制的C字符串。
num:要复制的字节数。
size_t是无符号整数类型。
返回值:返回destination。
实现:
char* my_strncpy(char* strDest, const char* strSource, size_t count)
{
assert(strDest&&strSource);
char* strHead = strDest;
for(; *strSource!='\0'&&count>0;count--)
{
*strDest++ = *strSource++;
}
if (*strSource == '\0')
{
*strDest++ = '\0';
}
while (count)
{
*strDest = '0';
count--;
}
return strHead;
}
strncat函数
功能:
附加字符串中的字符
将源的前num个字符追加到destination,再加上一个终止的空字符。 如果source中的C字符串的长度小于num,则仅复制直到终止空字符的内容。
声明:
官方给出函数声明:char * strncat ( char * destination, const char * source, size_t num );
destination: 指向目标数组的指针,该数组应包含一个C字符串,并且应足够大以包含级联的结果字符串,包括附加的空字符。
source: 要附加的C字符串。
num:要附加的字节数。
size_t是无符号整数类型。
返回值:返回destination。
实现:
char* my_strncat(char* strDest, const char* strSource, size_t count)
{
assert(strDest && strSource);
char* strHead = strDest;
while (*strDest)
{
strDest++;
}
for (; *strSource != '\0' && count > 0; count--)
{
*strDest++ = *strSource++;
}
*strDest = '\0';
return strHead;
}
strncmp函数
功能:
比较两个字符串的字符
最多将C字符串str1的num个字符与C字符串str2的num个字符进行比较。 此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续以下几对,直到字符不同,直到达到终止的空字符,或者直到两个字符串中的num个字符匹配为止,以先到者为准。
声明:
官方给出函数声明:int strncmp ( const char * str1, const char * str2, size_t num );
str1: 要比较的C字符串。
str2: 要比较的C字符串。
num:要附加的字节数。
size_t是无符号整数类型。
返回值:
返回一个整数值,指示字符串之间的关系:
返回值 | 表示 |
---|---|
<0 | 第一个不匹配的字符在str1中的值比在str2中的值低 |
0 | 两个字符串的内容相等 |
>0 | str1中第一个不匹配的字符的值大于str2中的值 |
实现:
int my_strncmp(const char* string1, const char* string2, size_t count)
{
assert(string1 && string2);
for (;string1!='\0'&&string2!='\0'&&count>=0;count--)
{
if (count == 0)
{
return 0;
}
else if (*string1 > * string2)
{
return 1;
}
else if (*string1 < *string2)
{
return -1;
}
else
{
string1++;
string2++;
}
}
if (*string1 == '\0' && *string2 != '\0')
{
return -1;
}
else if (*string1 != '\0' && *string2 == '\0')
{
return 1;
}
else
{
return 0;
}
}
测试:
int main()
{
char str1[] = "To be or not to be";
char str2[40];
char str3[40];
my_strncpy(str2, str1, sizeof(str2));
my_strncpy(str3, str2, 5);
str3[5] = '\0';
puts(str1);
puts(str2);
puts(str3);
char str1[20];
char str2[20];
strcpy(str1, "To be ");
strcpy(str2, "or not to be");
my_strncat(str1, str2, 6);
puts(str1);
char str[][5] = { "R2D2" , "C3PO" , "R2A6" };
int n;
puts("Looking for R2 astromech droids...");
for (n = 0; n < 3; n++)
if (my_strncmp(str[n], "R2xx", 2) == 0)
{
printf("found %s\n", str[n]);
}
return 0;
}