最近在做一个报文通信的事情,需要对报文的帧数据进行比较,帧头有固定的格式,比如:“0xbf, 0x13, 0x97, 0x74 ....”,所以需要对接收到的数据进行帧头的比较,我想到了用strncmp()这个C库里的函数,对相关字节进行比对,于是我就如下写了:
#include <stdio.h> #include <string.h> int main() { char pushbuf[] = {0xbf, 0x13, 0x97,0x74, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0xfc, 0xbf}; char buffer[] = {0xbf, 0x13, 0x97,0x74, 0x00, 0x77, 0x8, 0x0, 0x0, 0x0, 0x2b, 0x45, 0x6d, 0x38, 0xe9, 0xa}; if(strncmp(buffer, pushbuf, 14) == 0) { puts("竟然相等!!!\n"); } else { puts("应该这样才对\n"); } int i = 0; while(i<14) { printf("%2x---------%2x\n", pushbuf[i], buffer[i]); i++; } }
早在第6位就已经出现数据不等了,可是程序运行结果竟然是:
竟然相等!!!
经过长达1个小时的苦苦测试,发现这是strncmp中的一个陷进:
strncmp(char *str1, char *str2, int maxlen)函数是比较两个字符串前maxlen字符是否相等,如果等返回0,不等返回第一个不等字符的差(str1-str2)
但是,它一旦两个字符串在maxlen之前同时遇到了'\0'结束符,就结束比对了,而我的比较就是这么悲剧得相等了!
解决这个问题的办法是,用memcmp()函数 :
百度百科 写道
原型:int memcmp(const void *buf1, const void *buf2, unsigned int count);
用法:#include <string.h>或#include<memory.h>
功能:比较内存区域buf1和buf2的前count个字节。
说明:
当buf1<buf2时,返回值<0
当buf1=buf2时,返回值=0
当buf1>buf2时,返回值>0
用法:#include <string.h>或#include<memory.h>
功能:比较内存区域buf1和buf2的前count个字节。
说明:
当buf1<buf2时,返回值<0
当buf1=buf2时,返回值=0
当buf1>buf2时,返回值>0
OK!
相关推荐
在C语言中,字符串操作是编程中不可...了解它们的工作原理以及何时使用哪个函数,可以帮助避免常见的编程陷阱,如缓冲区溢出和字符串操作错误。在使用这些函数时,始终要注意边界条件和内存管理,以确保程序的健壮性。
在学习和使用TC库函数时,开发者需要理解每个函数的作用、参数和返回值,同时注意可能出现的错误和陷阱,比如内存泄漏、数组越界、文件未关闭等问题。对于初学者,通过查阅TC库函数的手册或在线文档,可以快速找到所...
6. `strcmp`与`strncmp`函数:这两个函数用于字符串的比较,但它们的工作原理也可以类比到数值比较上,返回值的正负代表字符串的相对顺序。 7. `sort`算法:在实际编程中,我们可能需要对数值数组进行排序,这就...
在C语言编程中,标准库函数是程序员进行各种操作的基础工具。...通过阅读“c语言库函数查询.pdf”,你可以深入学习每个函数的参数、返回值、使用示例以及可能遇到的陷阱,从而提升自己的C语言编程能力。
在C语言中,库函数是预...在实践中,应结合具体需求选择合适的函数,并注意理解和避免潜在的陷阱,例如内存溢出和未初始化的变量等问题。同时,学习C语言时,不断实践和阅读优秀的C语言代码也是提升技能的关键步骤。
C语言函数表提供的原始代码示例对于理解每个函数的实际工作方式至关重要,可以帮助读者避免常见的陷阱和错误。 在学习过程中,记得结合实际编写小程序来练习使用这些函数,因为实践是掌握编程技能的最佳途径。同时...
- `strcmp`, `strncmp`: 比较两个字符串的函数,通常用于排序或查找。 - `strlen`:返回字符串的长度,不包括终止符'\0'。 - `strstr`:在一个字符串中查找另一个字符串首次出现的位置。 3. **内存管理**: - `...
C语言是一种基础且强大的编程语言,它以其简洁、高效和高度可移植性而闻名。...这个CHM文件可能还包含了一些函数的使用技巧、陷阱和最佳实践,对于C语言的学习者和从业者来说,无疑是一份宝贵的资源。
2. 字符串处理函数:`strlen()` 计算字符串长度,`strcpy()` 和 `strncpy()` 复制字符串,`strcat()` 和 `strncat()` 连接字符串,`strcmp()` 和 `strncmp()` 比较字符串,`strstr()` 查找子字符串,`strchr()` 和 `...
C语言函数库是编程者在使用C语言进行程序开发时不可或缺的一部分。它包含了大量预先编译好的函数,供程序员在编写代码时调用,以实现...同时,深入理解这些函数的工作原理和潜在的陷阱,也是提高编程技能的关键步骤。
- **字符串比较**:`strcmp()`, `strncmp()` - **字符串连接**:`strcat()`, `strncat()` - **字符串查找**:`strstr()`, `strchr()` - **字符串替换**:`strtok()`, `strpbrk()` #### 15. C语言宏定义技巧 宏定义...
11. 字符串操作:`strcpy()`和`strncpy()`复制字符串,`strcat()`和`strncat()`连接字符串,`strcmp()`和`strncmp()`比较字符串,`strlen()`计算字符串长度。 掌握这些函数的使用方法是进行Linux下C语言编程的基础...
- `strcmp()` 和 `strncmp()`:比较两个字符串,`strncmp()`可指定比较的字符数。 - `strcat()` 和 `strncat()`:连接两个字符串,`strncat()`可限制连接的字符数。 4. 数学函数: - `sqrt()`:计算平方根,定义...