该任务首先返回stop
内string
内任意字符的第一个实例的索引:
int find_any_index(char string[], char stop[]) {
int i = 0;
int j = 0;
while(string[i++] != '\0'){
while(stop[j++] != '\0'){
if(string[i-1] == stop[j-1]){
return i-1;
}
}
j = 0;
}
return NOT_FOUND ;
}
例如, find_any_index("abcdefg", "zyd")
找到索引3。
但是,我现在需要按照以下规定执行同样的任务:
<string.h>
的
char *find_any_ptr(char *string, char* stop) {
return NULL ; // placeholder
}
我几乎无法理解指针,也不明白如何使用它们来访问单个字符而不是在数组中递增。
答案 0 :(得分:3)
在这种情况下,您将使用字符指针。在这里,您将针对string
中的每个字符检查stop
中的每个字符。当stop
中的任何字符匹配时,返回指向string
中位置的指针。如果未找到匹配项(返回string
或NULL
,示例将返回NULL
)示例:
char *find_any_index(char string[], char stop[]) {
char *p = string;
char *sp = NULL;
while (*p)
{
sp = stop;
while (*sp)
{
if (*sp == *p)
return p;
sp++;
}
p++;
}
return NULL;
}
答案 1 :(得分:0)
这是你的功能应该是什么样子的骨架:
char* find_any_index(char string[], char stop[])
{
char* cp1 = string;
char* cp2 = NULL;
for ( ; *cp1 != '\0'; ++cp1 )
{
for ( cp2 = stop; *cp2 != '\0'; ++cp2 )
{
}
}
return NULL;
}
我认为你可以完成其余的工作。
答案 2 :(得分:0)
不幸的是,无论在这个任务中总会有什么整数。 char
和unsigned char
是整数类型。我假设任务是生成有效的代码,没有不必要的变量(整数或其他)。
首先在stop
上迭代,我们可以构建一个查找表。表格中的每一位都对应于stop
中位位置的字符是否存在。
unsigned char table[CHAR_MAX / CHAR_BIT + 1] = { 0 };
while (*stop) {
unsigned char c = *stop++;
table[c / CHAR_BIT] |= 1 << c % CHAR_BIT;
}
这将内部循环减少到单个位测试,从O(mn)
到O(m+n)
的时间复杂度降低。
while (*string) {
unsigned char c = *string;
if (table[c / CHAR_BIT] & (1 << c % CHAR_BIT)) {
return string;
}
string++;
}
从技术上讲,c
是一个不必要的变量(和一个整数),但是通过在每个代码片段中使用c
,我消除了两个强制转换,这提高了此代码的易读性。我认为这更重要。
答案 3 :(得分:-2)
你可以从这样的事实开始:在C中,a [1]相当于*(a + 1)。 限制&#34;不能使用整数&#34;可能表明你应该使用&#34; char&#34;代替。它的作用类似于整数,但仅限于8位范围(0-255)。