在 C 语言的标准库文件中,提供了一系列用于字符串操作的相关函数,你可以自行学习并使用这些函数。
这里将介绍一个我们自己实现的函数,用于在字符串中查找特定的子字符串,并经过验证,可供大家参考使用。
一、实现
#define XSTRING_FAIL ((int16_t)-1)
int16_t xString_SearchKey(const char *sSource, const char *sKey)
{
uint16_t i, j;
if (*sKey == '\0')
{
return XSTRING_FAIL;
}
// Start address for comparison
for (i = 0; ((i < 0x7FFF) && (sSource[i] != '\0')); i++)
{
for (j = 0; ((i + j) < 0x7FFF); j++)
{
// Match with sKey
if (sKey[j] == '\0')
{
return i;
}
// Different, including sSource[i + j] == '\0'
else if (sSource[i + j] != sKey[j])
{
break;
}
}
}
return XSTRING_FAIL;
}
- sSource: 源字符串
- sKey: 需要匹配的子字符串
- 返回值使用有符号的 16 位整数:>=0 表示匹配成功,数值就是匹配到的起始位置,=-1 表示匹配失败
- 如果sKey字符串为空,则直接返回匹配失败
- 源字符串的长度最长不能超过 0x7FFF,这对于单片机程序来说通常是足够的
二、验证
static const struct
{
const char *s;
const char *k;
} oStr[] = {
// 可按下列格式增加数据
{"uuabcdefghiuuusijfoasidfjsoadf", "uuu"},
{"hosifuoasjfso293sjdi203", "abc"},
};
void TestXString_Perform(void)
{
uint8_t u8Cnt;
// 搜索字符串
for (u8Cnt = 0; u8Cnt < ARRAY_SIZE(oStr); u8Cnt++)
{
printf("Search %s in %s, ", oStr[u8Cnt].k, oStr[u8Cnt].s);
printf("Position: %d\n\n", xString_SearchKey(oStr[u8Cnt].s, oStr[u8Cnt].k));
}
}
- oStr 是一个结构体数组变量,结构体中有两个成员,分别指向源字符串和需要搜索的子字符串
- 你可以更改 oStr 变量中的现有字符串,以验证搜索功能的正确性
- 你也可以按这个格式增加字符串,以验证搜索功能的正确性
- 增删改 oStr 变量的内容,不要修改 TestXString_Perform 函数,这个函数将打印所有的字符串,并所有的搜索结果
完整的代码和验证程序,请参考chip_c: 芯片C语言框架和实用程序集合