我正在尝试创建一个应该执行以下操作的函数:
- 获取两个字符数组,一个比另一个小,并确定较小的字符数组是否是较大数组的子集。举个例子:
数组A:intval($time[0])
;数组B:{"s","c","h","o","o","l"}
。我有义务使用指针递增/递减操作。这是我制作的代码:
{"c","h"}
这就是我认为代码应该运行的方式:
将两个指向字符数组的指针作为函数“locator”的参数。变量计数是我放置的一个,以便告诉我A中出现的第一个字符的下标是什么(例如“school”和“ch”将是元素1所以A [1])。第一个for循环确保较大数组的第一个值是实际字符。 if语句在找到共同的字符时返回true。第二个for循环然后检查是否所有较小的数组都存在于较大的数组中。当我的程序编译时,所有这些都按预期工作。嵌套的if语句出现问题。事实上,如果较小的数组是较大数组的子集,我预计它是真的。为什么不是这样的?以“学校”和“ch”为例。 * Smallptr最初指向数组B的第一个元素(即“ch”),所以“c”。然后将它与“学校”中的“c”进行比较。然后递增两个指针,使得它们在它们各自的数组中都指向“h”。同样,它们再次递增,以便* Bigptr指向“o”并且* Smallptr指向'\ 0'。那不是这样吗?为什么函数总是输出else语句?
答案 0 :(得分:2)
您对第二个for
循环的理解不正确。
if (*Smallptr == *Bigptr) {
for (; (*Smallptr == *Bigptr) != '\0'; Smallptr++, Bigptr++) {}
由于您已经确定(在if
条件中该语句)*Smallptr == *Bigptr
,该比较会给出非零(true
)结果。
测试(*Smallptr == *Bigptr) != '\0'
将非零结果与值为零的char
进行比较。非零值永远不会等于零(至少不是标准积分类型,包括bool
),因此循环无效。
与您的描述一致的循环是
for (; (*Smallptr == *Bigptr) && *SmallPtr != '\0'; Smallptr++, Bigptr++) {}
检查两个字符是否彼此相等,并且都是非零。
答案 1 :(得分:1)
鉴于这是C ++,您可能希望利用标准库中已有的功能。我在这个订单上做了一些事情:
bool is_subset(std::string big, std::string small) {
std::sort(big.begin(), big.end());
std::sort(small.begin(), small.end());
std::string result;
std::set_difference(small.begin(), small.end(),
big.begin(), big.end(),
std::back_inserter(result));
return result.empty();
}
这并不能满足使用指针的要求,但IMO是一种更好的工作方式。
答案 2 :(得分:-1)
你有一些错误。 看看这个返工:
int locator(char *Bigptr, char *Smallptr) {
int count = 0;
for (; *Bigptr != '\0'; Bigptr++) {
if (*Smallptr == *Bigptr) {
for (; *Smallptr == *Bigptr && *Bigptr!='\0'; Smallptr++, Bigptr++) {
count++;
}
if (*Smallptr == '\0') {
return count;
}
break; //this is necesary in order not to stay in the main for loop
}
}
std::cout << "small is not the subset of big" << std::endl;
return count;
}
编辑:测试主要功能中的代码,它运作正常:
int main(int argc, const char * argv[]) {
std::cout << locator("hello","ohl"); //this prints "small is not the subset of big"
std::cout << locator("hello","ell"); //this prints "3" (the count of matching characters)
return 0;
}
答案 3 :(得分:-1)
The logic used in the line
for (; (*Smallptr == *Bigptr) != '\0'; Smallptr++, Bigptr++) {}
is not correct.
What you need is:
for (; (*Smallptr == *Bigptr) && *SmallPtr != '\0'; Smallptr++, Bigptr++)
{
++count;
}