c++ - 在C ++中递归搜索char数组子字符串中第一次出现的char数组子字符串
问题描述
我正在尝试递归搜索字符数组以查找由另一个字符数组组成的序列的第一次出现。我不允许使用字符串、预定义的字符串函数或循环。我正在搜索的字符数组是程序中使用的名称,并且此函数用于另一个函数中,该函数要求用户输入输入的子字符串,然后它在程序中搜索 5 个名称以查找任何具有完全匹配的名称的子字符串输入。我不能在这里发布其余的代码。目前,我的程序总是告诉我,无论我输入什么,都找不到名字。
bool IsSubString(char name[], char search_str[], int i, int found_flag, int idx)
{
if (name[i] != '\0' && search_str[idx] != '\0')
{
if (search_str[idx] == name[i])
{
if (idx == 0)
{
found_flag = 1;
}
else
{
found_flag = found_flag * 1;
}
idx++;
}
else
{
found_flag = 0;
idx = 0;
}
i++;
IsSubString(name, search_str, i, found_flag, idx);
}
if (search_str[idx] == '\0')
return found_flag;
else
return false;
}
解决方案
我发现很难准确理解您的要求,但据我了解,这里有两种解决方案,
如果你想检查 name[] == search_str[] :
bool IsEqual(char name[], char search_str[], int i)
{
if (name[i] == '\0' && search_str[i] == '\0')
return true;
if (search_str[i] != name[i])
return false;
return IsEqual(name, search_str, ++i)
}
如果要获取给定字符串中第一次出现子字符串的索引:
/*
str[] - The string to search in.
search[] - The substring to search for.
Returns -1 if substring not found.
*/
int getIndex(char str[], char search[], int index, int i,int j)
{
if( search[j] == '\0' )
return index; // Substring found.
if( str[i] == '\0' )
return -1; // Search string ended but substring not found.
if( str[i] == search[j] )
{
if( j == 0 ) index = i; // Sets index equal to the index of first charector of search in str
j++;
}
else
{
index = -1; // Sets index back to -1 due to missmatched charector.
j = 0;
}
return getIndex(str[], search[], index, ++i, j) // Continue search.
}
要使用该功能,
getIndex(char_array_to_search, search_string, -1, 0 , 0);
例如 ,
printf("%d",getIndex("the main string", "main", -1,0,0)); // prints 4
printf("%d",getIndex("one and one", "one", -1,0,0)); // prints 0
printf("%d",getIndex("one and one", "one", -1,1,0)); // prints 8
printf("%d",getIndex("nospace", "nos", -1,0,0)); // prints 0
您必须为 index 传递 -1,为 j 传递 0。如果您为 i 传递任何大于 0 的数字,则搜索将从该索引开始。
如果您只想知道子字符串是否存在,
bool found = getIndex(str, search, -1, 0,0) != -1;
只是为了好玩,这里有一个压缩得多的版本,也许是为了给你的老师留下深刻印象:
int getIndex(char str[], char search[], int index, int i,int j)
{
if( search[j] == '\0' )
return index; // Substring found.
if( str[i] == '\0' )
return -1; // Search string ended but substring not found.
index = (j==0) * ((str[i] == search[j]) * (i + 1) - 1) + (j!=0) * index;
j += (str[i] == search[j]) - (str[i] != search[j])*j;
return getIndex(str[], search[], index, ++i, j) // Continue search.
}
推荐阅读
- prolog - Prolog - 程序跳过阅读?
- templates - Ansible 模板:试图索引到一个两级列表
- swift - 如果在应用程序内部扫描了条码,则捕获
- python - 如何查找并打印数组中大于某个数字的元素?
- mysql - MySQL 输出列基于与最大 ID 对应的值
- amazon-web-services - 修补后 EC2 实例 IAM 角色更改
- javascript - 如何使用“mysite.com/?search=words”概念在返回和第四次导航时记住过滤/搜索结果页面停留的位置?
- vue.js - 如何使用参数触发“更改”事件?
- mono - 我在哪里可以下载 mono-4.6.1.5?
- javascript - 简单的 5 位计时器不显示预期结果