字符串(二)

本文目标:

    介绍几个常用的 c语言 字符串操作函数(头文件 string.h 包含了使用 c语言字符串 函数 所需要的原型和声明)

纲要:

  • 0.字符数组初始化
  • 1.获取字符串长度;
  • 2.复制字符串
  • 3.连接字符串
  • 4.字符串的比较
  • 5.字符串的查找

 

0.字符数组的初始化

char  szStr1[10] = {0};       ///// 全部赋值为 “0”

char  szStr2[10];    

memset(szStr2, sizeof(szStr2), 0);  ////  用 memset 函数初始化 

char  szStr3[10];

ZeroMemory(szStr3, sizeof(szStr3));  ///  用 ZeroMemory 函数初始化

 

字符数组的 格式化 

int  sprintf(char* _Dest, const char* _Format, ...);

示例:

1 char szDst1[20] = { 0 };
2 sprintf(szDst1, "heliangAAAAAAAA"); 
3 sprintf(szDst1, "GoodNight");  /// 实践证明,它会覆盖之前的字符串,而且会在字符串("GoodNight")末尾添加 '\0'

再举一例:

1 char szDst1[20] = { 0 };
2 char szDst2[20] = "Master Oogway";
3 char szDst3[20] = { 0 };
4 sprintf(szDst1, "%s", szDst2);  /// 将一个字符数组中的字符串赋值给另一个字符数组
5 sprintf(szDst3, "hello:%d", 12345);  /// 带整数 的 格式化形式

 

1.获取字符串长度:

1.1基本介绍:

char szStr4[10] = "Oogway";     /////       strlen(szStr4) 结果为 6 

char szStr5[6] = {'O', 'o', 'g', 'w', 'a', 'y'};   //////   strlen(szStr5)  结果是 不可预知的。(从 szStr5首地址开始,一个字节一个字节查找,直到找到 '\0' 才返回)

1.2拓展:

    strlen()返回一个类型为 size_t 的值。这个类型是在头文件 stddef.h 中定义的,它是一个无符号整数类型。在表达式中使用无符号数可能导致不可预料的结果。

 

if(strlen(X) >= strlen(Y)) ....   ////  正常, 语句会按照你预想的工作

if(strlen(X) - strlen(Y) >=0)....//// 不正常,这条语句会一直为真。 strlen的结果是一个无符号数,所以操作符 >= 左边的表达式也将是无符号数,而无符号数绝不可能是负的。

char  szStr0[] = "Oogway";

if(strlen(szStr0) - 10) .... //// 不正常,表达式中同时包含了有符号数和无符号数。其执行结果类似于 语句 size_t iRes = strlen(szStr0) - 10;  其结果会一个无符号数。

把strlen的 返回值 强制 转为 int ,可以消除这个问题。

这里并不是推荐全都转为 int,拓展strlen只是为了说明, strlen 的返回值是size_t,是一个无符号类型,编程中需要记住这点。不能犯低级错误。

2.复制字符串

  • 2.1 strcpy:

函数原型:

    char*  strcpy(char* dst,  char const* src);

注意:

    程序员必须 保证 目标字符数组 的空间足以容纳需要复制的字符串。如果字符串比数组长,多余的字符仍被复制,它们将覆盖原先存储于数组后面的内存空间的值。strcpy无法解决这个问题,因为它无法判断目标字符数组的长度。

    如果复制过来的字符串长度超过了dst的存储空间,使用strlen计算dst字符长度的时候,将产生不可预知的结果。    

示例:

char  szDst[20] = {0};

char  szSrc = "hello strcpy";

strcpy(szDst, szSrc);  ////  将szSrc里面的字符串拷贝到szDst字符数组中 

  • 2.2 strncpy:

函数原型:

    char* strncpy(char* dst, char const* src, size_t len);

注意:

    strncpy总是正好向 dst 写入 len个字符。注意!它的结果不会以 NUL 字节结尾。

    如果 strlen(src)的值小于 len,dst 数组就用额外的 NUL 字节填充到 len 长度。如果strlen(src)的值大于或等于len,那么只有len个字符被复制到dst中。

示例:

char szDst[4] = {0};

strncpy(szDst, "Oogway", sizeof(szDst)-1); //// 将会向 szDst拷贝3个字符。因为 strncpy不是以NUL字节结尾,所以,我们只能拷贝 sizeof(szDst)-1 个字节。是不是终于明白,为啥 好多代码里面都会有这个 sizeof(szDst)-1 了,^_^。

3.连接字符串

3.1 strcat

函数原型:

    char*  strcat(char* dst, char const* src);

注意:

    strcat函数要求dst参数原先已经包含了一个字符串(可以是空字符串)。它找到这个字符串的末尾('\0' 字符的那个地方),并把 src字符串的一份拷贝添加得到这个位置(\0 字符会被src中的字符覆盖)。

    程序员必须保证目标字符数组剩余的空间足以保存整个源字符串。

    strcat 总会在结果字符串后面添加一个 NUL 字节(就是我们说的'\0'字符)

 示例:

下面的代码,验证了2个问题。

1.strcat确实是在'\0'的那个位置开始填充字符('\0'字符被src中的字符覆盖).

2.strcat确实会在结果字符串(dst字符数组)后面添加一个NUL字节。这里,为了验证,我们故意超出szDst1数组的长度。然后,通过内存拷贝,将szDst1后面的49个字节拷贝到另一个数组中观察结果。结果显示,szBuff[11]是一个'\0'字符(NUL 字节)。

1      char szDst1[8] = { 0 };
2      strcat(szDst1, "hello");
3      szDst1[6] = 'A';   //// 验证1
4      strncat(szDst1, "BBBBBB",6);
5      char szBuff[50];//// = { 0 };
6      memcpy(szBuff, szDst1, sizeof(szBuff)-1);  ////验证2

3.2 strncat

函数原型:

    char*  strncat(char* dst, char const* src, size_t len);

有了前面对 strcpy 和 strncpy 的详细介绍,这里就不详细介绍strncat了。strncat相比 strcat,就是多了一个 参数,限制 了拷贝过来的字符的个数。

有一点需要注意, strncat 总是在结果字符串后面添加一个NUL字节,而且它不会像strncpy那样对目标数组用 NUL 字节进行填充。(见示例)

示例:

只是拷贝了ABC 和一个NUL 字节,并未在后面填充 6 个NUL字节。

     char szDst1[20] = { 0 };
     strcat(szDst1, "hello");
     szDst1[6] = 'A';////是在 '\0'字符之后填充的 无效字符,填充无效字符,主要是为了验证 strncat 是否会附加 '\0'.
     szDst1[7] = 'A';
     szDst1[8] = 'A';
     szDst1[9] = 'A';
     szDst1[10] = 'A';
     szDst1[11] = 'A';
     szDst1[12] = 'A';
     strncat(szDst1, "ABC", 10);/////我们是想给szDst1附加字符串"ABC",但是我们传入的字符长度是10。我们想看看后面剩余的6个字符,是否会用 '\0' 字符填充 

 

4.字符串的比较

strcmp();

int  strcmp(char const* s1, char const* s2);

如果s1 小于 s2, strcmp 函数返回一个小于零的值。如果s1 大于 s2,函数返回一个大与零的值。如果这两个字符串相等,函数就返回零。

 

strncmp();

int strncmp(char const* s1, char const* s2, size_t len);

strncmp最多比较len个字节。

5.字符串的查找

strchr:查找  一个字符

函数原型:

char*  strchr(char const* str, int ch);

strchr在字符串str中查找 字符 ch 第1次出现的位置,找到后函数返回一个指向该位置的指针。如果不存在,返回一个NULL指针。

 

strstr:查找  一个子串 

函数原型:

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

strstr在s1中查找整个s2第1次出现的启示位置,并返回一个指向该位置的指针。如果s2没有完整的出现在s1的任何地方,函数将返回一个NULL指针。

如果第2个参数是一个空字符串,函数将返回s1。

 

posted @ 2016-08-18 08:51  乌龟大师  阅读(412)  评论(0)    收藏  举报