C语言 str 开头库函数
使用方法记录
1 strpbrk
函数原型:char *strpbrk(const char *s, const char *accept);
函数说明:strpbrk()函数在字符串s中找到字符串accept中任何字节的第一个匹配项。
例子:
#include <stdio.h>
#include <string.h>
int main()
{
char *str_1 = "Hello CSDN!";
char *str_2 = "Csdn";
char *re_str = NULL;
re_str = strpbrk(str_1, str_2);
printf("%s\n", re_str == NULL ? "Not find": re_str);
return 0;
}
输出:
CSDN!
注意,这个函数关注大小写,如果没有找到则会返回 ‘null’
2. strsep
例子:
#include <stdio.h>
#include <string.h>
int main()
{
char *source = "hello, world! welcome to CSDN";
char delim[] = "!";
char *s = NULL;
char *re_str = NULL;
s = strdup(source);
printf("%s\n", s);
re_str = strsep(&s, delim);
printf("%s\n", re_str == NULL ? "Not find": re_str);
printf("%s\n", s);
return 0;
}
输出:
hello, world! welcome to CSDN
hello, world
welcome to CSDN
2 strdup & strndup & strdupa & strndupa
函数原型 :
char *strdup(const char *s);
char *strndup(const char *s, size_t n);
char *strdupa(const char *s);
char *strndupa(const char *s, size_t n);
函数说明:
这4个函数申请新的内存并拷贝参数中的字符串到新内存中。
如内存不能成功申请返回 ‘NULL’ ,并设置errorno 的值。如申请成功,则返回指向新的字符串的指针。
最后一个字母是 ‘a’ 的函数是使用alloca进行内存申请,前两个实现是使用malloc进行实现。 使用后注意要使用free进行释放内存。
例子:
int main ()
{
char str[] = "Hello CSDN !";
char *str_dup = NULL;
str_dup = strdup(str);
printf("str_dup = %s\n", str_dup);
printf("str = %s\n", str);
str[0] = 'h';
printf("str_dup = %s\n", str_dup);
printf("str = %s\n", str);
free(str_dup);
return 0;
}
输出:
str_dup = Hello CSDN !
str = Hello CSDN !
str_dup = Hello CSDN !
str = hello CSDN !
3 strstr & strcasestr
函数原型:
char *strstr(const char *haystack, const char *needle);
char *strcasestr(const char *haystack, const char *needle);
函数说明:
从haystack 字符串参数中找到needle参数的子串。找到了返回指向找到字串的首个字符的指针,否则返回NULL。
strcasestr 与 strstr 类似,只是strcasestr不关心字符串的大小写。
例子:
int main ()
{
char str[] = "Hello CSDN !";
char str2[] = "cSDN";
char *str_re = NULL;
str_re = strcasestr(str, str2);
printf("output = %s\n", str_re);
return 0;
}
输出:
output = CSDN !
特别注意 :
需要在最前面(#define <string.h>之前加上#define _GNU_SOURCE),要不然会出现警告,很可能导致执行时错误。详见 man 7 feature_test_macros
4 strcspn & strspn
**函数原型: **
size_t strspn(const char *s, const char *accept);
size_t strcspn(const char *s, const char *reject);
函数说明:
strspn 是在s 中,从s字符串的开始找出与accept字符串相同的字符数量。s的开始必须和accept一样,否则会返回0 。
strcspn 是在s 中,从s字符串的开始找出与accept字符串不相同的字符数量。s的开始必须和accept不一样,否则返回0 。
也就是说当两个字符串完全相等的时候 strspn 相当于 strlen(s) 或者strlen(accept)。accept为空字符串时strcspn 相当于strlen(s)。
例子(strspn):
int main ()
{
char str[] = "Hello CSDN !";
char str2[] = "HE";
int re;
re = strspn(str, str2);
printf("output = %d\n", re);
return 0;
}
输出:
output = 1 (注意,这里是大小写敏感的)
例子 (strcspn):
int main ()
{
char str[] = "Hello CSDN !";
char str2[] = "llo";
int re;
re = strcspn(str, str2);
printf("output = %d\n", re);
return 0;
}
输出:
output = 2
5 strtok & strtok_r
**函数原型: **
char *strtok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim, char **saveptr);
**函数说明: **
在字符串str中找到第一个以delim字符作为分隔符的子串。返回指向字串的指针。
strtok_r 为 strtok 的可重入(reentrant)版本。saveptr 是一个临时的内存空间,这个空间由用户给出。
注意:
经过测试,该函数只是简单的将第一次出现分隔字符的位置的字符替换为 ‘\0’ ,实际后面的字符还是存在的,具体看看例子就明白了。
例子(strtok):
int main ()
{
char str[] = "Hello CSDN !";
char str2[] = "o";
char * re;
re = strtok(str, str2);
printf("output = %s\n", re);
printf("output1 = %s\n", str);
printf("output2 = %c\n", str[4]);
printf("output2 = %s\n", &str[5]);
return 0;
}
输出:
output = Hell
output1 = Hell
output2 =
output2 = CSDN !
6 strtod & strtof & strtold
函数原型:
double strtod(const char *nptr, char **endptr);
float strtof(const char *nptr, char **endptr);
long double strtold(const char *nptr, char **endptr);
函数说明:
将nptr指向的字符串参数转换成double 、 float 、 long double的数字。endptr指向需要转换数字之后的一个字符位置。
例子(strtod):
int main ()
{
char *str = "123.321 CSDN";
char * tmp = NULL;
double num = 0;
num = strtod(str, &tmp);
printf("num = %.3f\n", num);
printf("str = %s\n", str);
printf("tmp = %s\n", tmp);
return 0;
}
输出:
num = 123.321
str = 123.321 CSDN
tmp = CSDN
7 strtol & strtoll
**函数原型: **
long int strtol(const char *nptr, char **endptr, int base);
long long int strtoll(const char *nptr, char **endptr, int base);
函数说明:
这两个函数都是将前面nptr的参数前面的字符串转换为int类型的数。和strtod类似,不同的是,strtol使用第三个参数来指定按照某种进制来进行字符串到数字的转换(2到36)。strtoll返回值可以看出,其可以转换更大的数字。
例子:
int main()
{
int num = 0;
char str[] = "-fffFHELLO CSDN!\n";
char *endptr = NULL;
num = strtol(str, &endptr, 16);
printf("num = %d\n", num);
printf("endptr = %s\n", endptr);
return 0;
}
输出:
num = -65535
endptr = HELLO CSDN!
注意,被转换的字符串可以带有 正 / 负 号。
8 strtoul & strtoull
**函数原型: **
unsigned long int strtoul(const char *nptr, char **endptr, int base);
unsigned long long int strtoull(const char *nptr, char **endptr, int base);
函数说明:
和strtol基本相同,但是返回值为unsigned int类型。
例子:
int main()
{
unsigned int num = 0;
char str[] = "-0xfffFHELLO CSDN!\n";
char *endptr = NULL;
num = strtoul(str, &endptr, 16);
printf("num = %d\n", num);
printf("endptr = %s\n", endptr);
return 0;
}
输出:
num = -65535
endptr = HELLO CSDN!
虽然返回的是unsigned int 类型,但是编译器自动将unsigned int返回值提升到 int类型。
9 strerror
函数原型:
char *strerror(int errnum);
函数说明:
该函数将errno 的值转换为可供是阅读的字符串。还与之相匹配的可重入(reentrant) 函数 strerror_r。
例子:
int main()
{
int my_errno = EAGAIN;
printf("%s\n", strerror(my_errno));
return 0;
}
输出:
Resource temporarily unavailable