strcmp函数的两种实现

本文介绍了两种在C语言中实现字符串比较的方法。第一种使用了while循环进行逐字符对比,直到遇到不匹配的字符或者字符串结束符。第二种则加入了对空指针的检查,并在发现不相等字符时立即返回。这两种方法都在GCC编译器上进行了验证。

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

摘自 http://www.iteye.com/topic/790388
#include<stdio.h>

int strcmp(const char *str1,const char *str2)
{
	/* 注释以下的五行(while循环)可以简写为:
	 * for(;(*str1==*str2)&&*str1!='\0';str1++,str2++);
	 *  */
	while((*str1==*str2)&&*str1!='\0')
	{
		str1++;
		str2++;
	}

	if(*str1=='\0'&&*str2=='\0') return 1;
	else return -1;
}

int main()
{
	char *st1="abdefg";
	char *st2="abcdefg";
	printf("%d\n",strcmp(st1,st2));

	char *st3="12345";
	char *st4="12345";
	printf("%d\n",strcmp(st3,st4));

	return 0;
}

#include<stdio.h>

int strcmp(const char *str1,const char *str2)
{
	while(str1!=NULL&&str2!=NULL)
	{
		while(*str1++==*str2++)
		{
			if(*str1=='\0'&&*str2=='\0') return 1;
		}
		
		return -1; //不等的情况
	}

	return -2; //有指针为空的情况
}

int main()
{
	char *st1="abdefg";
	char *st2="abcdefg";
	printf("%d\n",strcmp(st1,st2));

	char *st3="12345";
	char *st4="12345";
	printf("%d\n",strcmp(st3,st4));

	char *st5="xyz",*st6=NULL;
	printf("%d\n",strcmp(st5,st6));

	return 0;
}

在下在gcc的编译器当中编译通过。
### strcmp 函数在汇编语言中的实现 `strcmp` 是 C 标准库中的一个字符串比较函数,用于逐字符比较两个以 NULL 结尾的字符串。如果第一个不匹配的字符小于第二个,则返回负数;如果相等则返回零;如果大于则返回正数。 以下是 `strcmp` 的一种可能的汇编语言实现: #### 实现逻辑 1. 使用寄存器存储两个输入字符串的地址。 2. 循环读取并比较每一对对应的字符。 3. 如果发现不同的字符,计算差值并退出循环。 4. 如果到达任一字符串的结束符 `\0`,判断是否已完全相同。 5. 返回结果:基于上述条件设置标志位或直接返回数值。 ```asm section .text global strcmp strcmp: ; 初始化指针到参数传递的位置 (通常通过栈或者寄存器传入) mov rax, [rdi] ; 将第1个字符串加载至rax cmp byte [rsi], 0 ; 检查第2个字符串首字节是否为'\0' je end_with_zero_rsi; 若是跳转处理 compare_loop: mov al, [rdi] ; 加载当前字符(左操作数) mov bl, [rsi] ; 加载对应位置字符(右操作数) cmp al, bl ; 对比两者 jne not_equal_exit ; 不同立即跳出 test al, al ; 测试al是否达到终止符('\0') je equal_strings ; 已经遍历完毕且无差异 inc rdi ; 增加左侧索引偏移量 inc rsi ; 同样增加右侧索引偏移量 jmp compare_loop ; 继续下一轮对比 not_equal_exit: sub al, bl ; 计算两者的ASCII码差值作为最终结果 ret ; 返回给调用者 equal_strings: xor eax, eax ; 设置eax=0表示完全一致的结果 ret end_with_zero_rsi: test al, al ; 判断左边是否有剩余未处理部分 setnz al ; 非零设为true(-1),否则false(0) neg eax ; 转换为适当形式输出 ret ``` 此代码片段展示了如何利用低级指令完成高级功能[^2]。注意实际应用中具体细节会因目标平台架构不同而有所调整,比如某些体系结构支持更高效的 SIMD(Single Instruction Multiple Data)技术加速批量数据运算过程。 另外,在现代编译工具链里像 LLVM 这样的项目提供了高度优化版本的标准库函数实现方案[^4],它们往往综合考虑性能、兼容性和安全性等多个维度因素设计而成。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值