string函数分析

string函数包含在string.c文件中,经常被C文件使用。

1. strcpy

函数原型: char* strcpy(char* str1,char* str2);

函数功能: 把str2指向的字符串拷贝到str1中去

函数返回: 返回str1,即指向str1的指针

/**

* strcpy - Copy a %NUL terminated string

* @dest: Where to copy the string to

* @src: Where to copy the string from

*/

char * strcpy(char *dest, const char *src)

{

char *tmp = dest;


while((*dest++ = *src++) != ‘\0’);


return tmp;

}

2. strncpy

/**

* strncpy - Copy a length-limited, %NUL-terminated string

* @dest: Where to copy the string to

* @src: Where to copy the string from

* @count: The maximum number of bytes to copy

*

* Note that unlike userspace strncpy, this does not %NUL-pad the buffer.

* However, the result is not %NUL-terminated if the source exceeds

* @count bytes.

*/

char * strncpy(char * dest,const char *src,size_t count)

{

char *tmp = dest;

while (count-- && (*dest++ = *src++) != '\0')

/* nothing */;

return tmp;

}

3. strcat

函数原型: char* strcat(char * str1,char * str2);

函数功能: 把字符串str2接到str1后面,str1最后的'\0'被取消

函数返回: str1

/**

* strcat - Append one %NUL-terminated string to another

* @dest: The string to be appended to

* @src: The string to append to it

*/

char * strcat(char * dest, const char * src)

{

char *tmp = dest;

while (*dest)

dest++;

while ((*dest++ = *src++) != '\0')

;

return tmp;

}

4. strncat

/**

* strncat - Append a length-limited, %NUL-terminated string to another

* @dest: The string to be appended to

* @src: The string to append to it

* @count: The maximum numbers of bytes to copy

*

* Note that in contrast to strncpy, strncat ensures the result is

* terminated.

*/

char * strncat(char *dest, const char *src, size_t count)

{

char *tmp = dest;

if (count) {

while (*dest)

dest++;

while ((*dest++ = *src++)) {

if (--count == 0) {

*dest = '\0';

break;

}

}

}

return tmp;

}

5. strcmp

匹配返回0,不匹配返回非0。

函数原型: int strcmp(char * str1,char * str2);

函数功能: 比较两个字符串str1,str2.

函数返回: str1<str2,返回负数; str1=str2,返回 0; str1>str2,返回正数.

/**

* strcmp - Compare two strings

* @cs: One string

* @ct: Another string

*/

int strcmp(const char * cs,const char * ct)

{

register signed char __res;

while (1) {

if ((__res = *cs - *ct++) != 0 || !*cs++)

break;

}

return __res;

}

6. strncmp

匹配返回0,不匹配返回非0。

/**

* strncmp - Compare two length-limited strings

* @cs: One string

* @ct: Another string

* @count: The maximum number of bytes to compare

*/

int strncmp(const char * cs,const char * ct,size_t count)

{

register signed char __res = 0;

while (count) {

if ((__res = *cs - *ct++) != 0 || !*cs++)

break;

count--;

}

return __res;

}

7. strchr

函数原型: char* strchr(char* str,char ch);

函数功能: 找出str指向的字符串中第一次出现字符ch的位置

函数返回: 返回指向该位置的指针,如找不到,则返回空指针

参数说明: str-待搜索的字符串,ch-查找的字符

/**

* strchr - Find the first occurrence of a character in a string

* @s: The string to be searched

* @c: The character to search for

*/

char * strchr(const char * s, int c)

{

for(; *s != (char) c; ++s)

if (*s == '\0')

return NULL;

return (char *) s;

}

8. strrchr

/**

* strrchr - Find the last occurrence of a character in a string

* @s: The string to be searched

* @c: The character to search for

*/

char * strrchr(const char * s, int c)

{

const char *p = s + strlen(s);

do {

if (*p == (char)c)

return (char *)p;

} while (--p >= s);

return NULL;

}

可用于去除目录文件的目录



#include <stdio.h>
#include <string.h>

#define DIR_FILE "/tmp/xxx/test"
int main()
{
char *file;

if(strrchr(DIR_FILE, '/'))
file = strrchr(DIR_FILE, '/') + 1;

printf("dir_file-> file [%s]\n", file);

if(strrchr(file, '/'))
file = strrchr(DIR_FILE, '/') + 1;

printf("file-> file [%s]\n", file);

return 0;
}


运行结果



dir_file-> file [test]
file-> file [test]


9. strlen

函数原型: unsigned int strlen(char * str);

函数功能: 统计字符串str中字符的个数(不包括终止符'\0')

函数返回: 返回字符串的长度.

/**

* strlen - Find the length of a string

* @s: The string to be sized

*/

size_t strlen(const char * s)

{

const char *sc;

for (sc = s; *sc != '\0'; ++sc)

/* nothing */;

return sc - s;

}

10. strnlen

/**

* strnlen - Find the length of a length-limited string

* @s: The string to be sized

* @count: The maximum number of bytes to search

*/

size_t strnlen(const char * s, size_t count)

{

const char *sc;

for (sc = s; count-- && *sc != '\0'; ++sc)

/* nothing */;

return sc - s;

}

11. memset

函数原型: void *memset(void *s, int c, size_t n)

函数功能: 字符串中的n个字节内容设置为c

函数返回:

参数说明: s-要设置的字符串,c-设置的内容,n-长度

所属文件: <string.h>,<mem.h>

/**

* memset - Fill a region of memory with the given value

* @s: Pointer to the start of the area.

* @c: The byte to fill the area with

* @count: The size of the area.

*

* Do not use memset() to access IO space, use memset_io() instead.

*/

void * memset(void * s,int c,size_t count)

{

char *xs = (char *) s;

while (count--)

*xs++ = c;

return s;

}

12. bcopy

/**

* bcopy - Copy one area of memory to another

* @src: Where to copy from

* @dest: Where to copy to

* @count: The size of the area.

*

* Note that this is the same as memcpy(), with the arguments reversed.

* memcpy() is the standard, bcopy() is a legacy BSD function.

*

* You should not use this function to access IO space, use memcpy_toio()

* or memcpy_fromio() instead.

*/

char * bcopy(const char * src, char * dest, int count)

{

char *tmp = dest;

while (count--)

*tmp++ = *src++;

return dest;

}

13. memcpy

函数原型: void *memcpy(void *dest, const void *src, size_t n)

函数功能: 字符串拷贝

函数返回: 指向dest的指针

参数说明: src-源字符串,n-拷贝的最大长度

所属文件: <string.h>,<mem.h>

/**

* memcpy - Copy one area of memory to another

* @dest: Where to copy to

* @src: Where to copy from

* @count: The size of the area.

*

* You should not use this function to access IO space, use memcpy_toio()

* or memcpy_fromio() instead.

*/

void * memcpy(void * dest,const void *src,size_t count)

{

char *tmp = (char *) dest, *s = (char *) src;

while (count--)

*tmp++ = *s++;

return dest;

}

14. memcmp

/**

* memcmp - Compare two areas of memory

* @cs: One area of memory

* @ct: Another area of memory

* @count: The size of the area.

*/

int memcmp(const void * cs,const void * ct,size_t count)

{

const unsigned char *su1, *su2;

int res = 0;

for( su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)

if ((res = *su1 - *su2) != 0)

break;

return res;

}

15. memscan

/**

* memscan - Find a character in an area of memory.

* @addr: The memory area

* @c: The byte to search for

* @size: The size of the area.

*

* returns the address of the first occurrence of @c, or 1 byte past

* the area if @c is not found

*/

void * memscan(void * addr, int c, size_t size)

{

unsigned char * p = (unsigned char *) addr;

while (size) {

if (*p == c)

return (void *) p;

p++;

size--;

}

return (void *) p;

}

16. strstr

/**

* strstr - Find the first substring in a %NUL terminated string

* @s1: The string to be searched

* @s2: The string to search for

*/

char * strstr(const char * s1,const char * s2)

{

int l1, l2;

l2 = strlen(s2);

if (!l2)

return (char *) s1;

l1 = strlen(s1);

while (l1 >= l2) {

l1--;

if (!memcmp(s1,s2,l2))

return (char *) s1;

s1++;

}

return NULL;

}

17. memchr

/**

* memchr - Find a character in an area of memory.

* @s: The memory area

* @c: The byte to search for

* @n: The size of the area.

*

* returns the address of the first occurrence of @c, or %NULL

* if @c is not found

*/

void *memchr(const void *s, int c, size_t n)

{

const unsigned char *p = s;

while (n-- != 0) {

if ((unsigned char)c == *p++) {

return (void *)(p-1);

}

}

return NULL;

}