Пропуск, если утверждение сжатия двух символов - PullRequest
0 голосов
/ 10 июня 2019

Я не могу понять, почему программа пропускает оператор if внутри цикла for, даже если символы идентичны.

цель программы - найти подстроку внутри другой строки.

Кстати, я новичок в программировании, поэтому я надеюсь, что это не что-то глупое;)

#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 ]

3 голосов
/ 10 июня 2019

Измените эту строку:

bool isTrue=true;

, которая объявляет новую переменную и скрывает предыдущую переменную, в эту строку:

isTrue=true;  // Remove the "bool"

, которая только присваивает значение, но нене создавать новую переменную.

0 голосов
/ 10 июня 2019

Давайте просто сосредоточимся на цикле здесь.Вот что я придумал:

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 каждый раз во втором цикле.Вам нужно сделать это только один раз, перед вторым циклом.Во-вторых, если это больше не подстрока, вы можете выйти из второго цикла.Это волшебным образом не станет снова истинным.

В-третьих, как только вы нашли подстроку, вам не нужно продолжать проверять.Так что вы можете просто поставить это как проверку в конце первого цикла.

0 голосов
/ 10 июня 2019

Попробуйте это:

#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 в начале. Поэтому, когда вы делаете это, вы делаете isTrue только для этого цикла for, который только там изменен, а не после цикла. Просто удалите bool bevore, и он должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...