1. 主角登场:strcmp是什么?
strcmp的全称是string compare(字符串比较)。它的任务很简单,就是像查字典一样,比较两个字符串谁“大”谁“小”。
核心规则(记住这个就行):
它从左到右,一个字符一个字符地比(比的是字符的 ASCII 码值)。
- 如果两个字符串一模一样,返回0。
- 如果字符串1 比 字符串2 “大”,返回正数(> 0)。
- 如果字符串1 比 字符串2 “小”,返回负数(< 0)。
通俗类比:
想象你在比两个单词 "apple" 和 "banana"。
你从第一个字母开始看:'a' 和 'b'。
因为在字母表里 'a' 在 'b' 前面,所以 "apple" 比 "banana" 小。strcmp("apple", "banana")就会返回一个负数。
2. 实战:它在哪出现?
我们在上一讲qsort排序结构体时,就用到过它!
假设我们要按学生的姓名排序,姓名是字符串(char name[20]),我们不能直接做减法
(name1 - name2是错的!),这时候就得请strcmp出马。
#include <string.h> strcmp 的头文件 struct Stu { char name[20]; int age; }; 按名字排序的比较函数 int cmp_stu_by_name(const void* e1, const void* e2) { 1. 先把 void* 强转成 struct Stu* 2. 取出 name 成员(它本身就是 char* 类型) 3. 交给 strcmp 去比较 return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name); }看,strcmp帮我们省去了手写循环去逐个比较字符的麻烦,非常省心。
3. 避坑指南:千万别用==比字符串!
这是新手最容易犯的错!
char str1[] = "hello"; char str2[] = "hello"; if (str1 == str2) { ... } ❌ 错误! if (strcmp(str1, str2) == 0) { ... } ✅ 正确!为什么?
str1 == str2比较的是两个数组的首地址。这两个数组在内存里是不同的两块地盘,地址肯定不一样,所以结果永远是假。strcmp(str1, str2)比较的是两个地址里存放的内容。内容都是 "hello",所以返回 0,表示相等。
总结一下:strcmp,它是 C 语言里专门用来比较字符串内容的函数。记住它的返回值规则(0、正数、负数),并且永远不要用==来比较两个字符串的内容。