字符串处理函数-创新互联

本笔记内容已上传到个人博客网站,推荐网站上观看。
字符串处理函数 | 洛希的智慧之殿堂 (luoxi.work)

创新互联建站是专业的疏附网站建设公司,疏附接单;提供成都网站建设、网站设计,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行疏附网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!文章目录
  • 字符串处理函数
    • 1.存放和表示字符串的两种方法
      • ①字符串常量
      • ②字符数组
    • 2.字符串处理函数
      • ①获取字符串的长度:`strlen`
      • ②拷贝字符串的`strcpy`和`strncpy`
        • (1)strcpy
        • (2)strncpy
      • ③连接字符串的`strcat`和`strncat`
        • (1)strcat
        • (2)strncat
      • ④比较字符串的strcmp和strncmp
        • (1)strcmp
        • (2)strncmp

字符串处理函数 1.存放和表示字符串的两种方法 ①字符串常量

“I LOVE YOU”,“洛希”

②字符数组
int main
{
//初始化字符数组的每个元素
    char str1[10] = {'L','O','V','E','\0'};
//可以不写元素的个数,因为编译器会自动计算
    char str2[] = {'L','O','V','E','\0'};
//使用字符串常量初始化字符数组
    char str3[] = {"LOVE"};
//使用字符串常量初始化,可以省略大括号
    char str4[] ="LOVE";
2.字符串处理函数 ①获取字符串的长度:strlen

为了区分strlen和sizeof的区别,下面用一串代码来进行演示下他们最后所得到的长度

#include#include//引用此头文件才能使用字符串函数,当然像vs2019就可以不用,不过最好写上。
int main ()
{char str[] = "LOVE";
printf("%d\n",strlen(str));
printf("%d\n",sizeof(str));
return 0 ;    
}

下面分别为用sizeof计算以及用strlen计算得到的结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fKmma6qe-1669878738354)(https://luoxi2334.oss-cn-shanghai.aliyuncs.com/luoxi-picture/image-20221201133823416.png)]

可以看到seziof比strlen多计算出来了一个,那就是我们常见的空字符’\0’

②拷贝字符串的strcpystrncpy

对于以上两个拷贝字符串的函数,它们到底有什么区别了,以下用一串代码来进行演示下它们的区别。

(1)strcpy
#include#includeint main ()
{char str1[]="LOVE";
    char str2[]="LOVE YOU";
    char str3[114514];
    strcpy(str2,str1);//将str1的字符串拷贝到str2中
    strcpy(str3,"I LOVE YOU");//将"T LOVE YOU"这个字符串拷贝到str3中
    printf("str1=%s\n",str1);
    printf("str2=%s\n",str2);
    printf("str3=%s\n",str3);
return 0 ;
}

最后打印出来的结果为

image-20221201135257682

但是,如果我们将str2的字符串拷贝到str1中将会发生什么呢?

因为str1只储存了LOVE以及\0这五个字符,但是str2存了一共9个字符,很明显把str2的拷贝到str1中会出现错误,我们来看下这个错误的结果会带来什么吧!

#include#includeint main ()
{char str1[]="LOVE";
    char str2[]="LOVE YOU";
    char str3[114514];
    strcpy(str1,str2);//将str2的字符串拷贝到str1中
    strcpy(str3,"I LOVE YOU");//将"T LOVE YOU"这个字符串拷贝到str3中
    printf("str1=%s\n",str1);
    printf("str2=%s\n",str2);
    printf("str3=%s\n",str3);
return 0 ;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-90cIhX8t-1669878738355)(https://luoxi2334.oss-cn-shanghai.aliyuncs.com/luoxi-picture/image-20221201140516834.png)]

但是并没有造成什么影响,这是为什么呢?实际上如果以上代码出现这种错误都是会覆盖掉一些字符的,但是本人用的是VSCODE的编译器,所以没有什么影响。

(2)strncpy

strncpy对比strcpy的区别就是多了一个n!当然这是开玩笑的,实际上,多的这一个n就使得它拥有了限制字符拷贝的功能。

我们通过以下代码来进行理解吧。

#include#includeint main ()
{char str1[]="LOVE";
    char str2[]="LOVE YOU";
    char str3[114514];
    strncpy(str1,str2,6);//将str2的字符串拷贝到str1中,并且限制数量为6
    strcpy(str3,"I LOVE YOU");//将"T LOVE YOU"这个字符串拷贝到str3中
    printf("str1=%s\n",str1);
    printf("str2=%s\n",str2);
    printf("str3=%s\n",str3);
return 0 ;
}

对于以上的代码将会有怎样的输出结果呢?

image-20221201141257798

这样我们就实现了限制拷贝的数量,但是我们发现以上打印结果有个很大的问题,就是love y后面出现了乱码?这又是为什么呢?这也是我们经常犯的一个致命的错误,就是把空字符又忘记了!这个在我往期的笔记也有提到过,空字符的重要程度,请参考我的往期文章字符和字符串 | 洛希的智慧之殿堂 (luoxi.work)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SDMTwHTi-1669878738355)(https://luoxi2334.oss-cn-shanghai.aliyuncs.com/luoxi-picture/image-20221201141557022.png)]

对于以上出现的问题,我们就必须要使得str1的第七个字符用’\0’使其进行终止,修改后的代码如下。

#include#includeint main ()
{char str1[]="LOVE";
    str1[6]='\0';//使其拷贝到第7个字符进行终止
    char str2[]="LOVE YOU";
    char str3[114514];
    strncpy(str1,str2,6);//将str2的字符串拷贝到str1中,并且限制数量为6
    strcpy(str3,"I LOVE YOU");//将"T LOVE YOU"这个字符串拷贝到str3中
    printf("str1=%s\n",str1);
    printf("str2=%s\n",str2);
    printf("str3=%s\n",str3);
return 0 ;
}

最后得到的结果才是我们如意的结果

image-20221201141859555

③连接字符串的strcatstrncat

对于连接字符串的strcat以及strncat的功能很明显就跟连接有很大的关系。而我们看这两个函数是不是也是第二个函数比第一个函数多了一个n?让我们来看看这两个函数的相关功能的演示代码吧!

(1)strcat
#include#includeint main ()    
{char str1[] = "I LOVE ";
    char str2[] = "YOU";
    strcat(str1,str2);//将str2的字符串拼接到str1字符串的后面
    printf("str1:%s\n",str1);    
    return 0 ;
}

对于以上代码的打印结果如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CVYqFI77-1669878738356)(https://luoxi2334.oss-cn-shanghai.aliyuncs.com/luoxi-picture/image-20221201142714923.png)]

(2)strncat

对于这个函数,很明显也是起到了一共限制的作用,但是唯一有个不同的是,它会自动追加空字符将其结束!所以我们就可以"偷下懒"不用写’\0’了,我们用一串代码来进行演示一下吧!

#include#includeint main ()    
{char str1[] = "I LOVE ";
    char str2[] = "YOU";
    strncat(str1,str2,1);//将str2的字符串拼接到str1字符串的后面,限制字符为1
    printf("str1:%s\n",str1);    
    return 0 ;
}

以下为输出结果

image-20221201143357711

④比较字符串的strcmp和strncmp

对于这两个函数的功能,和明显就是比较字符串啦!但是,它比较的究竟是什么呢?是字符串的长度吗?还是什么…如果是比较字符串的长度那第二个函数的限制字符串的长度是不是有点矛盾了,所以这里来讲它们不是用来比较字符串的长度的,而是通过比较ASCII码值来比较两个字符串是否一致。所以它们常在if语句内进行判断。

对于以上的内容,我将用以下的代码来进行演示它们的功能。

(1)strcmp
#include#includeint main()
{char str1[] = "I LOVE";
    char str2[] = "I LOVE";
    if (strcmp(str1, str2))
    {printf("两个字符串一致");
    }
    else
    {printf("两个字符串不一致");
    }
    return 0;
}

对于以上代码,我们可以指定str1和str2的字符串是一致的,最后的结果是否会如意呢?我们来看打印结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dc4FG5eD-1669878738356)(https://luoxi2334.oss-cn-shanghai.aliyuncs.com/luoxi-picture/image-20221201144523932.png)]

很奇怪,为什么会出现这个结果呢?它们不都是一致的吗?为什么会判断出来它们不一致,这是因为我们忽略了这个函数最后返回的值的多少

而strcmp如何计算获得返回值呢?

  • 自左向右逐个按照ASCII码值进行比较,直到出现不同的字符或遇’\0’为止。
  • 如果返回值< 0,则表示 s1 小于 s2。
  • 如果返回值 >0,则表示 s1 大于 s2。
  • 如果返回值 = 0,则表示 s1 等于 s2。

我们用一串代码来计算下它们的返回值吧!

#include#includeint main(void)
{char a[] = "LOVe";
    char b[] = "LOVE";
    char c[] = "love";
    char d[] = "LOVe";
    
	//strcmp()只能比较字符串, 其他形式的参数不能比较 
	printf("strcmp(a, b):%d\n", strcmp(a, b));//字符串之间的比较b和a进行比较,对应上面s1和s2比较
    printf("strcmp(a, c):%d\n", strcmp(a, c));
    printf("strcmp(a, d):%d\n", strcmp(a, d));
	return 0;
}

打印结果如下

image-20221201145203140

所以对于我们上面一开始写的代码,if语句里面因为它俩一致返回值为0,导致判断为假,所以我们只需要加个 !就可以实现判断了。

修改的代码如下

#include#includeint main()
{char str1[] = "I LOVE";
    char str2[] = "I LOVE";
    if (!strcmp(str1, str2))
    {printf("两个字符串一致");
    }
    else
    {printf("两个字符串不一致");
    }
    return 0;
}

此时对应的输出结果才符合预期,以下为输出结果。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NIQjhfiD-1669878738356)(https://luoxi2334.oss-cn-shanghai.aliyuncs.com/luoxi-picture/image-20221201145452913.png)]

(2)strncmp

对于这个函数,很明显是起到了限制比较字符个数的作用,我们用以下的代码来帮助理解吧!

#include#includeint main()
{char str1[] = "I LOVE dasdjasdkasd";
    char str2[] = "I LOVE asdsaodiasd";
    if (!strncmp(str1, str2,7))//限制比较前7个字符
    {printf("两个字符串一致");
    }
    else
    {printf("两个字符串不一致");
    }
    return 0;
}

以下为打印的结果

image-20221201145736329

相反的,如果我们限制前10个字符呢?

#include#includeint main()
{char str1[] = "I LOVE dasdjasdkasd";
    char str2[] = "I LOVE asdsaodiasd";
    if (!strncmp(str1, str2,10))//限制比较前10个字符
    {printf("两个字符串一致");
    }
    else
    {printf("两个字符串不一致");
    }
    return 0;
}

打印结果如下
image-20221201145452913

相反的,如果我们限制前10个字符呢?

#include#includeint main()
{char str1[] = "I LOVE dasdjasdkasd";
    char str2[] = "I LOVE asdsaodiasd";
    if (!strncmp(str1, str2,10))//限制比较前10个字符
    {printf("两个字符串一致");
    }
    else
    {printf("两个字符串不一致");
    }
    return 0;
}

打印结果如下
image-20221201145951821

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


名称栏目:字符串处理函数-创新互联
新闻来源:http://scyanting.com/article/cdpohg.html