strcmp()函数与strcpy()函数介绍

本文深入探讨了C语言中字符串处理函数strcmp和strncmp的使用方法,以及它们在字符串比较中的安全性和效率。同时,文章也讲解了strcpy和strncpy函数在字符串拷贝中的应用,并强调了strncpy函数在防止缓冲区溢出方面的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. strcmp函数与strncmp函数

在前面的文章中我们看到了strcat函数及它更安全的用法strncat。

接下来我们谈谈strcmp函数及其安全的用法strncmp。

strcmp函数的作用是比较字符串,用法如下strcmp(字符串1,字符串2),它会比较这两个字符串,如果字符串相等,

返还0.

考虑下面的代码。

#include<stdio.h>
#include<string.h>
int main()
{
	char *ch = "hell word";
	char *ch1 = "hello word";
	char ch2[40] = "hello word";
	int a = strcmp(ch, ch1);//不一样的比较,
	int b = strcmp(ch1, ch2);//一样的比较
	printf("%d %d", a, b);
	getch();
	return 0;
}

输出结果是 -1 0;前面告诉大家如果字符串相同返还0;但如果不同呢。

如果:比较单个字符串,比如“A”与“B”,则返还-1;同理,“B’与”A"返还1;返还的值可能不同,只要不是0不就很好。

这个比较与AS||码有关。但如果两个字符串前面几个字母相同,那么strcmp函数会一个一个挨着比较。

对于strncmp函数来讲,比较有了限定strcmp(字符串1,字符串2,限定数字),有了限定数字后,该函数会比较你所限定的

前几个字符。

2.strcpy与strncpy

strcpy函数的作用是拷贝,拷贝出来的字符串叫目标字符串,最初的字符串被称为源字符串

用法:strcpy(字符串数组,字符串)。

看下面的代码

#include<stdio.h>
#include<string.h>
int main()
{
	char ch[100];
	char *p = "hell word";
	printf("%s", strcpy(ch, p));
	getch();
	return 0;
}

输出结果:hell word。

从输出结果我们可以看出,该函数返还的是第一个参数的地址。

同理更安全的选择是strncpy,你可以在最后的参数写上一个数字,来确保拷贝的最大字符数,注意\0.

考虑下面的代码

#include<stdio.h>
#include<string.h>
int main()
{
	char ch[5];
	char *p = "hell word";
	strncpy(ch, p, 3);//这样写是对的
	ch[4] = '\0';//如果没有的话,ch就不是一个字符数组
	printf("%s", ch);

	getch();
	return 0;
}

运行一下程序,你会发现字符的拷贝不会为你自己添加空字符,考虑一下是否需要添加空字符。

<< `strcpy` 和 `strcmp` 是 C 标准库中的两个非常常用的字符串处理函数。 ### strcpy 函数 **定义原型** ```c char *strcpy(char *dest, const char *src); ``` - **参数说明**: - `dest`: 目标字符数组(目标缓冲区),该空间必须足够大以容纳来自源 (`src`) 的所有字符,包括终止空字符 `\0`。 - `src`: 源字符串指针,即要复制的内容。 - **返回值**: 返回指向 `dest` 的指针。 - **功能描述**: 将 src 所指向的字符串拷贝到 dest 中,并且会将末尾的 '\0' 字符也一起复制过去。如果目的地址的空间不够,则可能会造成内存溢出等问题。 #### 使用示例 ```c #include <stdio.h> #include <string.h> int main(){ char source[50] = "Hello"; char destination[50]; // Copy string from source to destination. strcpy(destination, source); printf("Copied String: %s\n", destination); } ``` ### strcmp 函数 **定义原型** ```c int strcmp(const char *str1, const char *str2); ``` - **参数说明**: - `str1`, `str2`: 需要比对的两串字节序列或 ASCII 编码表示的文字内容. - **返回值**: 如果 str1 和 str2 完全相同则返回零; 若第一个不匹配处前者的小于后者就返回一个小于 0 的数;否则为大于 0 的整数值 - **注意事项**: 进行的是逐个比较对应位置上的ASCII码大小关系直到遇到'\0',所以对于非打印字符如控制符号等也需要谨慎对待! #### 示例用法 ```c #include <stdio.h> #include <string.h> int main() { int ret; /* Comparing two strings */ ret = strcmp("abc", "def"); if(ret > 0) puts("\"abc\" is greater than \"def\""); else if (ret == 0) puts("\"abc\" equals \"def\""); else puts("\"abc\" is less than \"def\""); return(0); } ``` 使用这两个函数时需要注意以下几点: 1. 在调用 `strcpy()` 前确保有足够的空间存储被复制过来的数据避免越界写入导致程序崩溃或者安全漏洞。 2. 对比结果仅适用于区分大小写字母、数字和其他可显示字符间的排序逻辑; 不建议直接用于其他编码集比如 Unicode 或者多字节字符环境里头判断相等情况因为它们内部可能还包含有多额外的信息字段影响最终判定结论正确性。 3. 当涉及到用户输入或者其他不确定来源的数据时候应当考虑先做必要的清理工作例如去除前后空白再进行后续操作防止意外情况发生.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值