为什么我的程序 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"));

} 

你也可以使用堆栈而不是两个循环来完成这个任务,这比这更有效。