字符串函数
C 标准库 - <string.h>
string .h 头文件定义了一个变量类型、一个宏和各种操作字符数组的函数。
strlen
size_t strlen(const char *s);
返回s的字符串长度(不包括结尾的0)
示例:
#include <stdio.h>
#include <string.h>
int main( )
{
char a[] = "Hello";
printf("strlen=%lu\n",strlen(a));
printf("sizeof=%lu\n",sizeof(a));
return 0;
}
结果:
strcmp
int strcmp(const char *s1, const char*s2);
比较两个字符串,返回:
-
0:s1==s2
-
1:s1>s2
-
-1:s1<s2
示例:
#include <stdio.h>
#include <string.h>
int main( )
{
char s1[] = "Hello";
char s2[] = "Hello";
char s3[] = "hello";
printf("%d\n",strcmp(s1,s2));
printf("%d\n",strcmp(s1,s3));
printf("%d\n",strcmp(s3,s2));
return 0;
}
结果:
注意:
hello之所以比Hello小是因为H的ASCII码比h的ASCII码小我们可以做在我们的电脑上输入printf("%d\n",'H'-'h');
我们得到的结果是-32
因为它是一个负数所以可以证实我们的结论。
strcpy
char * strcpy(char *restrict dst, const char *restrictsrc);
-
把src的字符串拷贝到dst
- restrict表明src和dst不重叠 (C99)·
-
回dst
- 为了能链起代码来
用途:复制一个字符串
char *dst = (char*)malloc(strlen(src)+1);
strcpy(dst,src);
示例:数组版本
#include <stdio.h>
#include <string.h>
char* mycpy( char* dst, const char* src){
int idx = 0;
while (src[idx] ) {
dst[idx] = src[idx];
idx++;
}
dst[idx] = '\0';
return dst;
}
int main(int argc,char count *argv[])
{
char s1[] = "Hello";
char s2[] = "Hello";
strcpy(s1,s2);
return 0;
}
指针版本:
#include <stdio.h>
#include <string.h>
char* mycpy( char* dst, const char* src){
char* ret = dst;
while (*src) {
*dst = *src;
dst++;
src++;
}
//可以将while更改为下面的while循环
//while (*dst++ = *src++);
*dst='\0';
return dst;
}
int main(int argc,char count *argv[])
{
char s1[] = "Hello";
char s2[] = "Hello";
strcpy(s1,s2);
return 0;
}
strcat
char * strcat(char *restrict s1, const char *restricts2);
- 把s2拷贝到s1的后面,接成一个长的字符串
- 返回s1
- s1必须具有足够的空间
实例:
#include <stdio.h>
#include <string.h>
int main ()
{
char src[50], dest[50];
strcpy(src, "This is source");
strcpy(dest, "This is destination");
strncat(dest, src, 15);
printf("最终的目标字符串: |%s|", dest);
return(0);
}
结果:
strcmp,strcpy,strcat的安全版本
strcpy和strcat都可能出现安全问题
那就是如果目的地没有足够的空间会出现问题。
安全版本
char * strncpy(char *restrict dst, const char *restrictsrc,size_t n);
char * strncat(char *restrict s1, const char *restricts2,size_t n);
int strncmp(const char *s1, const char *s2, size_t n);
strchr和strrchr
char * strchr(const char *s, int c);
- 在字符串s中寻找c字符
char * strrchr(const char *s, int c);
- 表示从右边开始寻找
- 该函数返回在字符串 str 中第一次出现字符 c 的位置,如果未找到该字符则返回 NULL。
实例:
#include <stdio.h>
#include <string.h>
int main ()
{
const char str[] = "hello";
const char ch = 'e';
char *ret;
ret = strchr(str, ch);
printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);
return(0);
}
结果:
strstr
char *strstr(const char *haystack, const char *needle)
- 在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 ‘\0’。
char *strcasestr(const char *haystack, const char *needle)
- 忽略大小写来寻找
实例:
#include <stdio.h>
#include <string.h>
int main()
{
const char haystack[20] = "RUNOOB";
const char needle[10] = "NOOB";
char *ret;
ret = strstr(haystack, needle);
printf("子字符串是: %s\n", ret);
return(0);
}
结果: