【问题标题】:Why does my program return true as the result is expected to be false?为什么我的程序返回 true,因为结果应该是 false?
【发布时间】:2021-11-18 22:31:58
【问题描述】:

我在 C 中实现了 C“strstr”函数。这个函数在参数中接受 2 个字符串,并判断第一个字符串是否包含第二个字符串。然而,虽然预期结果为假,但它返回真。请给我一个解释好吗?

代码如下:

#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循环对我来说太复杂了。不如把return -2放在程序的最后,看看有没有漏掉一些情况?
  • return 1 是您想要的吗?是否有任何可能的逻辑路径没有 return
  • i = 0 和j = 0 开始,您的代码比较相等的第一个字符。然后它将j 增加到1,将i 增加到1。然后它执行循环测试j &lt; strlen(ch2) - 1。由于ch2是“sh”,它的长度是2,所以strlen(ch2) - 1是1,而j不小于1,所以循环结束,代码返回1。重写你的代码,使i遍历每个可能的起始位置,并且在循环内永远不会改变(例如,在测试子字符串时),只有在继续到下一个起始位置时。修复j 上的循环以检查所有ch2

标签: c algorithm boolean c-strings strstr


【解决方案1】:

是因为函数定义没有意义。:)

对于这个while循环

while (i < strlen(ch1) - 1)
{

内部while循环中的this if语句

        if(i == strlen(ch1) - 1) 

strlen( ch2 ) 等于 2 时,总是评估为逻辑假。

因此这个返回语句

return 0;

在这种情况下永远无法获得控制权。

也就是说,内部 while 循环将只有一次迭代,并且当循环获得控制时,i 由于外部 while 循环的条件而小于strlen(ch1) - 1

【讨论】:

    【解决方案2】:

    注意事项

    • 从 0 循环到 strlen(ch1)-1 直到最后一个字符才循环
    • return 1; 位于外部 while 循环的末尾。因此,它会在退出第一个循环后立即执行。由于该外循环只执行一次,并且在此期间它返回 1。这就是它总是返回 1 的原因。

    我在您的代码中添加了一些更改如下。还要注意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"));
    
    } 
    
    

    您也可以使用堆栈而不是两个循环来执行此任务,这比这更有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 2022-07-05
      • 2012-05-21
      • 2013-09-18
      • 2015-10-03
      • 2012-08-08
      相关资源
      最近更新 更多