forum.jpg

在文章中嵌入式Linux开发《C语言专题(五:(3)函数之字符串函数1)》中对C语言中字符串函数做了简要介绍。打算用2篇文章来详细介绍字符串函数(strlen、strcpy、strncpy、strcat、strncat、strcmp、strncmp、strcasecmp、strncasecmp、strchr、strrchr、strstr、strpbrk、strspn、 strcspn、atoi等)的使用。
前段时间在一个项目中抓取一个网址的信息并从中提取相应地理位置信息用到了字符串操作函数。其实无论是在嵌入式开发中还是Java,JavaWEB开发中,字符串操作函数都很常见,所以一定要学会对字符串函数的使用。我们可以在Linux发行版系统中(比如ubuntu、fedora等)通过man 3 xxx(字符串名字) 来查询C语言中字符串函数的详细用法。
在实际开发时用到这些字符串函数,一定要记得包含对应头文件#include <string.h>。如果没有加上,会提示warning: incompatible implicit declaration of built-in function ‘XXX’ [enabled by default] XXX是函数名。
(1)strlen:字符串长度函数
函数名:strlen
函数原型:size_t strlen(const char *s);
功能:计算字符串长度函数
返回值:字符串长度
说明:计算的长度不包含字符串结束标志\0字符
代码演示:
#include <stdio.h>
  • //一定要加上字符串操作头文件
  • #include <string.h>
  • //演示字符串长度操作
  • int main(int argc, char** argv)
  • {
  • char *str = "hello world";
  • //运行结果:字符串hello world的长度为:11
  • printf("字符串hello world的长度为:%d \n", strlen(str));
  • return 0;
  • }
  • 复制代码
    (2)strcpy:字符串复制函数
    函数名:strcpy
    函数原型:char *strcpy(char *dest, const char *src);
    功能:把源字符串src(包含结束标志\0)复制到目的字符串dest(不是字符串常量)
    返回值:目的字符串指针
    说明:如果目的字符串的长度小于源字符串,那么源字符串的内容就不能完全复制到目的字符串中。目标字符串中如果以前有内容将被完全覆盖。剩余没有完全复制的字符串会覆盖存储于原来目的字符串后面内存的值,如果修改了这些值可能会导致代码异常发生。因此这个函数在使用时有一定的缺陷,因此也要求开发者在使用这个函数时务必确保目的字符串的长度足以容纳源字符串的长度。
    代码演示:
    #include <stdio.h>
  • //一定要加上字符串操作头文件
  • #include <string.h>
  • //演示字符串复制操作
  • int main(int argc, char** argv)
  • {
  • char *src = "hello world";
  • char dest[20] = {0};
  • //运行结果:字符串复制操作:hello world
  • printf("字符串复制操作:%s \n", strcpy(dest, src));
  • return 0;
  • }
  • 复制代码
    (3)strncpy:字符串复制函数
    函数名:strncpy
    函数原型: char *strncpy(char *dest, const char *src, size_t n);
    功能:与strcpy作用类似,除了之多将源字符串src中的n个字符赋值到目的字符串dest中。
    返回值:目的字符串指针
    说明:如果源字符串的长度比n小,那么后续都会以\0作为作为补充,如果大于则只将n个字符复制到dest中,它的结果不会以\0结束也即还需要dest[n-1]='\0'还是dest[n]='\0'操作。所以对于开发人员来说最好源字符串的长度大于n同时目的字符串的空间至少要容纳n个字节。
    代码演示:
    #include <stdio.h>
  • //一定要加上字符串操作头文件
  • #include <string.h>
  • //演示字符串复制n个字节操作
  • int main(int argc, char** argv)
  • {
  • char *src = "hello world";
  • char dest[20] = {0};
  • //运行结果:字符串复制5个字节操作:hello
  • printf("字符串复制5个字节操作:%s \n", strncpy(dest, src, 5));
  • return 0;
  • }
  • 复制代码
    (4)strcat:字符串连接函数
    函数名:strcat
    函数原型: char *strcat(char *dest, const char *src);
    功能:将源字符串src直接连接到目的字符串dest的后面并且自动添加一个字符串结束标志符\0。
    返回值:目的字符串指针
    说明:字符串连接函数的2种形式与字符串复制函数很类似。和strcpy一样,开发者必须保证目的字符串的空间必须足够容纳源字符串。
    代码演示:
    #include <stdio.h>
  • //一定要加上字符串操作头文件
  • #include <string.h>
  • //演示字符串连接操作
  • int main(int argc, char** argv)
  • {
  • char *src = " world";
  • char dest[20] = {"hello"};
  • //运行结果:字符串连接操作:hello world
  • printf("字符串连接操作:%s \n", strcat(dest, src));
  • return 0;
  • }
  • 复制代码
    (5)strncat:字符串连接函数
    函数名:strncat
    函数原型:char *strncat(char *dest, const char *src, size_t n);
    功能:与strcat类似,也是把一个字符串连接到另外一个字符串的后面,只不过是将从源字符串src地址开始的n个字节连接到目的字符串中。
    返回值:目的字符串的指针
    说明:如果源字符串src容纳至少n个字节,那么src将要写n+1个字节(n个有效字节加上结束标志符\0)到目的字符串dest中因此目的字符串的长度至少是 strlen(dest)+n+1。
    代码演示:
    #include <stdio.h>
  • //一定要加上字符串操作头文件
  • #include <string.h>
  • //演示字符串连接4个字节操作
  • int main(int argc, char** argv)
  • {
  • char *src = " world";
  • char dest[20] = {"hello"};
  • //运行结果:字符串连接4个字节操作:hello wor
  • printf("字符串连接4个字节操作:%s \n", strncat(dest, src, 4));
  • return 0;
  • }
  • 复制代码
    (6)strcmp:字符串比较函数
    函数名:strcmp
    函数原型:int strcmp(const char *s1, const char *s2);
    功能:比较字符串s1和s2的大小
    返回值:如果比较结束都一样,那么这2个字符串相等。如果s1小于s2则比较的结果小于0,如果s1大于s2则比较的结果大于0,如果s1等于s2则比较的结果等于0,所以可以将比较的结果与0比较来判断2个字符串的大小。
    说明:比较的方法是对2个字符串中的字符逐个进行比较,直到遇到不匹配(也就是要么大于要么小于)情况就结束。
    代码演示:
    #include <stdio.h>
  • //一定要加上字符串操作头文件
  • #include <string.h>
  • //演示字符串比较操作
  • int main(int argc, char** argv)
  • {
  • char *src = "aa";
  • char *dest = "ab";
  • int n = strcmp(src, dest);
  • //运行结果:字符串比较aa小于ab
  • if (n == 0)
  • {
  • printf("字符串比较aa等于ab \n");
  • }
  • else if(n > 0)
  • {
  • printf("字符串比较aa大于ab \n");
  • }
  • else
  • {
  • printf("字符串比较aa小于ab \n");
  • }
  • return 0;
  • }
  • 复制代码
    (7)strncmp:字符串比较函数
    函数名:strncmp
    函数原型:int strncmp(const char *s1, const char *s2, size_t n);
    功能:与strcmp类似,只不过它是比较字符串s1和字符串s2的前n个字节的大小
    返回值:与strcmp类似
    说明:比较的方法是对2个字符串中前n个字符逐个进行比较,直到遇到不匹配(也就是要么大于要么小于)情况就结束。
    代码演示:
    #include <stdio.h>
  • //一定要加上字符串操作头文件
  • #include <string.h>
  • //演示字符串比较1个字节操作
  • int main(int argc, char** argv)
  • {
  • char *src = "aa";
  • char *dest = "ab";
  • int n = strncmp(src, dest, 1);
  • //运行结果:字符串比较aa和ab第一个字符相等
  • if (n == 0)
  • {
  • printf("字符串比较aa和ab第一个字符相等\n");
  • }
  • else if(n > 0)
  • {
  • printf("字符串比较aa第一个字符大于ab第一个字符 \n");
  • }
  • else
  • {
  • printf("字符串比较aa第一个字符小于ab第一个字符 \n");
  • }
  • return 0;
  • }
  • 复制代码