我在低级嵌入式系统中将字符的固定大小缓冲区与简单字符串进行比较。缓冲区比字符串大得多,所以我认为这就是比较运算符说两者不相等的原因。这促使我编写了一个简单的函数来比较字符串和缓冲区的开头 - 这是一个优雅的解决方案吗?感谢
int CompareString(const char* string, int strlen)
{
//first check to see if the length is the same
//if there is a null char at string length then
//they are equal
if(MsgBuffer[strlen] != '\0')
{
return 0; //they are not equal
}
strlen = strlen - 1;
while(strlen > -1)
{
if(string[strlen] != MsgBuffer[strlen])
{
return 0; //they are equal
}
strlen = strlen - 1;
}
return 1; //they are equal
}
答案 0 :(得分:3)
通常,您可以考虑使用strncmp
,其最大长度为固定缓冲区大小。
但可能是你在某种程度上受到限制,特别是考虑到你在嵌入式环境中运行。它也可能不适合比较空格填充的字符串,其中每个字符串在末尾具有不同数量的空格(对于像“甲醛”这样的字符串,不包括空格) - strncmp
不能很好地用于比较{{ 1}}和"Hello"
,如果大小为{'H','e','l','l','o',' ',' ',' '}
。
如果是这样的话,我会看到以下内容:
8
这将匹配末尾有任意数量空格的字符串,最大为特定大小,并且具有可以向其传递任意缓冲区的优点,而不是假设一个是全局区域。
顺便说一下,使用像#include <stdio.h>
int compStr (char *s1, char *s2, size_t sz) {
while (sz != 0) {
// At end of both strings, equal.
if ((*s1 == '\0') && (*s2 == '\0')) break;
// Treat spaces at end and end-string the same.
if ((*s1 == '\0') && (*s2 == ' ')) { s2++; sz--; continue; }
if ((*s1 == ' ') && (*s2 == '\0')) { s1++; sz--; continue; }
// Detect difference otherwise.
if (*s1 != *s2) return 0;
s1++; s2++; sz--;
}
return 1;
}
int main (void) {
printf ("%d\n", compStr ("Hello", "Hello", 5));
printf ("%d\n", compStr ("Hello", "Hello ", 5));
printf ("%d\n", compStr ("Hello ", "Hello", 5));
printf ("%d\n", compStr ("Hello ", "Hello ", 5));
printf ("%d\n", compStr ("HelloX", "Hello", 5));
printf ("%d\n", compStr ("HelloX", "HelloY", 5));
printf ("%d\n", compStr ("HelloX", "HelloY", 6));
return 0;
}
之类的标准库函数作为变量名称并不是一个好主意,因为您可能想要这样做。在某些时候,使用标准库。
答案 1 :(得分:1)
使用strncmp
答案 2 :(得分:1)
以下是您可以使用的一些代码。只需将比较字符串和缓冲区作为两个参数传递即可。此代码也应完全符合MISRA-C:2004。
sint8 gpfunc_strcmp (const uint8* s1, const uint8* s2)
{
while ((*s1 != '\0') && (*s2 != '\0'))
{
if (*s1 != *s2)
{
break;
}
else
{
s1++;
s2++;
}
}
return (sint8)(*s1 - *s2);
}
答案 3 :(得分:0)
“比较运算符”?你的意思是 == 等等吗?您不能使用它们来比较字符串,因为它们将比较位置而不是内容。您必须使用 strcmp 或 strncmp 。
(我猜你的实际问题的答案是,不,这不是一个优雅的解决方案,因为 strncmp 已经存在。但是,正如其他人所说,你的嵌入式环境可能会利用字符串库不方便。)