跳过两个字符压缩的if语句

时间:2019-06-10 19:43:52

标签: c

我不明白为什么即使字符相同,程序也会在for循环中跳过if语句。

该程序的目的是在另一个字符串中找到子字符串。

顺便说一句,我是编程新手,所以我希望这不是愚蠢的事情;)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
int main()
{
    bool isTrue=false;
    char str[50];
    char sub[50];
    int i,j,t;

    printf("Hello please enter a string: ");
    gets(str);
    printf("The substring you want to find: ");
    gets(sub);


    for(i=0;str[i] != 0; i++)
        if(sub[0] == str[i])
            for(j=0, t=i; sub[j] != 0; j++, t++){
                bool isTrue=true;
                if(sub[j]!=str[t])
                    isTrue=false;
            }


    if(isTrue)
        printf("The substring found !");
    else
        printf("No substring");

}

3 个答案:

答案 0 :(得分:3)

更改此行:

bool isTrue=true;

在此行中声明一个全新变量,并隐藏先前的变量:

isTrue=true;  // Remove the "bool"

仅分配一个值,而不创建新变量。

答案 1 :(得分:0)

尝试一下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
int main()
{
    bool isTrue=false;
    char str[50];
    char sub[50];
    int i,j,t;

    printf("Hello please enter a string: ");
    gets(str);
    printf("The substring you want to find: ");
    gets(sub);


    for(i=0;str[i] != 0; i++)
        if(sub[0] == str[i])
            for(j=0, t=i; sub[j] != 0; j++, t++){
                isTrue=true;
                if(sub[j]!=str[t])
                    isTrue=false;
            }


    if(isTrue)
        printf("The substring found !");
    else
        printf("No substring");

}

基本上,只有您在其中执行的代码:

for(j=0, t=i; sub[j] != 0; j++, t++){
                bool isTrue=true;

但是您确实在一开始就声明了isTrue。因此,当您执行此操作时,您只为该for循环创建一个isTrue,该for循环仅在其中更改,而不在循环之后。只需删除bool bevore,它就可以工作。

答案 2 :(得分:0)

让我们只关注这里的循环。这是我想出的:

for(i=0; str[i] != 0; i++){
    if(sub[0] == str[i]){
        isTrue = true;
        for(j=0, t=i; sub[j] != 0; j++, t++){
            if(sub[j]!=str[t]){
                isTrue=false;
                break;
            }
        }
        if(isTrue) break;
    }
}

首先,您不想在第二个循环中每次都将isTrue定义为true。您只需要在第二个循环之前执行一次。其次,一旦它不再是子字符串,则可以退出第二个循环。不会再神奇地成为现实。

第三,找到子字符串后,您无需继续检查。因此,您可以将其作为第一个循环结束时的检查。