網站首頁 編程語言 正文
1.函數介紹
1.1.函數接口
int __cdecl strcmp (const char * src,const char * dst);
這里是庫函數里面的函數定義接口。這個函數是將 src 和 dst 兩個字符串進行比較,即為字符串比較函數。
1.2.函數分析
分析:
1、strcmp 函數是比較兩個字符串中字符的順序的。實際上是拿其字符的ASCⅡ碼值來進行比較;
2、拿第一個字符串中的第一字符值減去第二個字符串中的第一個字符,如果為 0,則繼續向下比較;若不為 0,則返回差值的數。
3、標準規定:
- 第一個字符串大于第二個字符串,則返回大于 0 的數字;
- 第一個字符串等于第二個字符串,則返回 0;
- 第一個字符串小于第二個字符串,則返回小于 0 的數字。
1.3.函數的簡單使用
#include <stdio.h>
#include <string.h>
int main()
{
char ch1[] = "fbcd";
char ch2[] = "ab";
int ret = strcmp(ch1, ch2);
printf("%d\n", ret);
return 0;
}
運行結果:
為什么這里結果為1呢而不是其他大于0的數?來看看下面的分析
1.4.函數使用結果分析
分析:
先來看看倆字符串第一個字符在內存中的ASCⅡ值:
上面函數分析里面說了兩個字符的ASCⅡ值進行比較之后,不相等的返回大于0的數;因此這里返回的是1。在vs編譯器的庫函數中對于strcmp函數來說,比較兩個字符串ASCⅡ值大于 0 的就都返回 1;小于 0 的就都返回 -1。,當然這里是同意規定了一下,我們還可以不規定,直接返回他們的差值,這樣返回的差值也是大于 0 的數和小于 0 的數。
2.庫函數strcmp源代碼
2.1.庫函數源代碼
int __cdecl strcmp (const char * src,const char * dst)
{
int ret = 0 ;
while((ret = *(unsigned char *)src - *(unsigned char *)dst) == 0 && *dst)
{
++src, ++dst;
}
return ((-ret) < 0) - (ret < 0);
}
2.2.庫函數分析
分析:
1、這里面先用 unsigned char * 將其指針轉化為無符號型,在去取里面存的值,即得到字符的ASCⅡ值;
2、return ((-ret) < 0) - (ret < 0); 這一句就是讓差值大于 0 的返回 1;差值小于0的返回 -1。
3.模擬實現 strcmp 函數
3.1.模擬實現
//模擬實現strcmp函數
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 == * str)
{
if ( *str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
return *str1 - *str2;
}
int main(void)
{
//strcmp比較的是對應位置上的字符大小
char ch1[10] = { 0 };
char ch2[10] = { 0 };
scanf("%s", ch1);
scanf("%s", ch2);
printf("%d\n", my_strcmp(ch1, ch2));
}
3.2.模擬實現分析
分析:
1、因為這里是比較兩個字符串,所以字符串都不需要修改,因為都可以用const 修飾;
2、這里模擬實現的時候返回值是兩個字符值的差值。
3、也可以寫為差值大于 0 返回 1 ;差值小于0返回 -1 形式。
以上代碼均可運行,所用編譯環境為 vs2019 ,運行時注意加上編譯頭文件#define _CRT_SECURE_NO_WARNINGS 1
原文鏈接:https://blog.csdn.net/m0_56817529/article/details/124640919
相關推薦
- 2023-04-06 C語言如何實現循環輸入_C 語言
- 2022-06-16 基于Python+Matplotlib實現直方圖的繪制_python
- 2022-08-07 C#并行庫Parallel類介紹_C#教程
- 2022-04-01 Kubernetes中Nginx配置熱加載的全過程_nginx
- 2022-10-08 LyScript實現繞過反調試保護的示例詳解_python
- 2023-06-17 C#?輸出參數out問題_C#教程
- 2024-04-02 Centos無法獲取IP報No suitable device found for this con
- 2023-10-14 ORACLE存在就修改 不存在就新增(注意更新和新增語法不同于常規語法)
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支