为什么我的程序 return 为真,因为预期结果为假?
Why does my program return true as the result is expected to be false?
我正在用 C 语言实现 C“strstr”函数。这个函数在参数中有 2 个字符串,并判断第一个字符串是否包含第二个字符串。然而,虽然预期结果为假,但 returns 为真。你能给我解释一下吗?
这是代码:
#include <stdio.h>
#include <string.h>
int searchStr(char *ch1, char *ch2);
int searchStr(char *ch1, char *ch2)
{
int i = 0;
int j = 0;
while (i < strlen(ch1) - 1)
{
while (j < strlen(ch2) - 1)
{
if(i == strlen(ch1) - 1)
{
return 0;
}
else
{
if (ch1[i] == ch2[j])
{
j++;
i++;
}
else
{
if (j > 0)
{
j = 0;
}
else
{
i++;
}
}
}
}
return 1;
}
}
int main()
{
printf("%d", searchStr("science", "sh"));
}
此致
YT
是因为函数定义没有意义:)
对于这个 while 循环
while (i < strlen(ch1) - 1)
{
内部 while 循环中的这个 if 语句
if(i == strlen(ch1) - 1)
当 strlen( ch2 )
等于 2 时, 总是计算为逻辑假。
因此这个return声明
return 0;
在这种情况下永远不会获得控制权。
即内部 while 循环将只有一次迭代,当循环获得控制时 i
由于外部 while 循环的条件小于 strlen(ch1) - 1
。
几点注意事项
- 从 0 循环到 strlen(ch1)-1 直到最后一个字符才循环
return 1;
位于外部 while 循环的末尾。所以它在第一个循环退出后立即执行。由于外循环只执行一次,在那个时候它 return 1.This 就是为什么它总是 return 1.
我对您的代码添加了一些更改,因为 follows.Also 请注意 break
语句的用法。
#include <stdio.h>
#include <string.h>
int searchStr(char *ch1, char *ch2);
int searchStr(char *ch1, char *ch2)
{
int isContain = 0;
int i = 0;
int j = 0;
while (i < strlen(ch1) )
{
int k = i;
isContain = 1;
if(i == strlen(ch1) - 1) {
if(strlen(ch2) == 1 && ch1[k] == ch2[j]){
return 1;
}
else{
return 0;
}
}
while(j < strlen(ch2) ){
if(ch1[k] != ch2[j]){
isContain = 0;
j=0;
break;
}else{
j++;
k++;
}
}
if(isContain == 1){
return 1;
}
i++;
}
}
int main()
{
printf("%d", searchStr("scince", "h"));
}
你也可以使用堆栈而不是两个循环来完成这个任务,这比这更有效。
我正在用 C 语言实现 C“strstr”函数。这个函数在参数中有 2 个字符串,并判断第一个字符串是否包含第二个字符串。然而,虽然预期结果为假,但 returns 为真。你能给我解释一下吗?
这是代码:
#include <stdio.h>
#include <string.h>
int searchStr(char *ch1, char *ch2);
int searchStr(char *ch1, char *ch2)
{
int i = 0;
int j = 0;
while (i < strlen(ch1) - 1)
{
while (j < strlen(ch2) - 1)
{
if(i == strlen(ch1) - 1)
{
return 0;
}
else
{
if (ch1[i] == ch2[j])
{
j++;
i++;
}
else
{
if (j > 0)
{
j = 0;
}
else
{
i++;
}
}
}
}
return 1;
}
}
int main()
{
printf("%d", searchStr("science", "sh"));
}
此致
YT
是因为函数定义没有意义:)
对于这个 while 循环
while (i < strlen(ch1) - 1)
{
内部 while 循环中的这个 if 语句
if(i == strlen(ch1) - 1)
当 strlen( ch2 )
等于 2 时,总是计算为逻辑假。
因此这个return声明
return 0;
在这种情况下永远不会获得控制权。
即内部 while 循环将只有一次迭代,当循环获得控制时 i
由于外部 while 循环的条件小于 strlen(ch1) - 1
。
几点注意事项
- 从 0 循环到 strlen(ch1)-1 直到最后一个字符才循环
return 1;
位于外部 while 循环的末尾。所以它在第一个循环退出后立即执行。由于外循环只执行一次,在那个时候它 return 1.This 就是为什么它总是 return 1.
我对您的代码添加了一些更改,因为 follows.Also 请注意 break
语句的用法。
#include <stdio.h>
#include <string.h>
int searchStr(char *ch1, char *ch2);
int searchStr(char *ch1, char *ch2)
{
int isContain = 0;
int i = 0;
int j = 0;
while (i < strlen(ch1) )
{
int k = i;
isContain = 1;
if(i == strlen(ch1) - 1) {
if(strlen(ch2) == 1 && ch1[k] == ch2[j]){
return 1;
}
else{
return 0;
}
}
while(j < strlen(ch2) ){
if(ch1[k] != ch2[j]){
isContain = 0;
j=0;
break;
}else{
j++;
k++;
}
}
if(isContain == 1){
return 1;
}
i++;
}
}
int main()
{
printf("%d", searchStr("scince", "h"));
}
你也可以使用堆栈而不是两个循环来完成这个任务,这比这更有效。