как найти две подстроки

Я могу найти подстроку с помощью функции strstr. Например, я могу найти подстроку «Привет», но я хочу найти «Привет» и «Добро пожаловать». Не только один из них, я хочу найти их обоих. Я хочу думать о «привет» и «добро пожаловать», как будто это одно и то же слово. Если программа может найти мир «привет», она возвращает false, если программа может найти мир «добро пожаловать», она возвращает false, но если программа может найти слова «привет» и «добро пожаловать», она возвращает true. Как мне это сделать?

int main(){

int total=0;
char *p="Hello world welcome!";
   while ( strstr(p,"Hello") != NULL ) {
      printf("%s", p); // to know the content of p
      p++;
      total++;
   }
 printf("%i", total);
 getch(); // pause
}

person user3648443    schedule 19.10.2014    source источник
comment
Как вам должно было помочь размещение strstr внутри цикла while? Он найдет подстроку с первой попытки или нет. Никаких дальнейших действий не требуется.   -  person Jongware    schedule 19.10.2014
comment
@Jongware Я согласен. Единственное, что более необычно, чем strstr с циклом while, - это то, что он, кажется, тоже поднимается в опубликованных ответах. Я предполагаю, что мы могли бы оба быть в стране невежественных, но я немного сомневаюсь в этом прямо сейчас.   -  person WhozCraig    schedule 19.10.2014
comment
Верно. Как бы то ни было, цикл увеличивает количество вхождений для каждого символа, когда искомая строка находится за пределами начала. Например, для welcome будет возвращено 12.   -  person Jongware    schedule 19.10.2014


Ответы (3)


#include <stdio.h>
#include <string.h>

char find_two(char* p, const char* first, const char* sec) {
    char* t1 = strstr(p, first);
    char* t2 = strstr(p, sec);
    if (t1 != NULL && t2 != NULL) {
        return 1;
    }
    else {
        return 0;
    }
}

int main(void)
{
    char* p = "hello world welcome";
    printf("%d\n", find_two(p, "hello", "welcome"));
    printf("%d\n", find_two("hello i am xx", "hello", "welcome"));
    printf("%d\n", find_two("welcome i am xx", "hello", "welcome"));
    printf("%d\n", find_two("testing abc", "hello", "welcome"));

    return 0;
}

выход:

1
0
0
0

РЕДАКТИРОВАТЬ:

Некоторая другая реализация find_two (предложенная @Jongware):

char find_two(char* p, const char* first, const char* sec) {
    char *t1, *t2;
    if ((t1 = strstr(p, first)) == NULL) {
        return 0;
    }
    if ((t2 = strstr(p, sec)) == NULL) {
        return 0;
    }
    return 1;
}
person macfij    schedule 19.10.2014
comment
+1. Оптимизация (очень незначительная): если first не найдено, вы можете немедленно вернуть 0. - person Jongware; 19.10.2014
comment
@Jongware правда. Я просто хотел показать простое решение. - person macfij; 19.10.2014

Вы немного неясны в описании проблемы. Какова связь между двумя подстроками? Они связаны? типа "Привет, добро пожаловать"? Несмотря на то, что ваши коды позволяют сделать вывод, что вы хотите подсчитывать вхождения, это явно не указано в вашем вопросе. В общем, вы можете использовать функцию strstr так часто, как захотите. Two count two strings — почему бы не сделать:

int total_hello=0;
int total_welcome=0;
char *p="Hello world welcome!";
char *p_1=p;
char *p_2=p;
while ( strstr(p_1,"Hello") != NULL ) {
   printf("%s", p_1); // to know the content of p
   p_1++;
   total_hello++;
}
while ( strstr(p_2,"welcome") != NULL) {
    printf("%s", p_2);
    p_2++;
    total_welcome++;
}
return total_hello > 0 && total_welcome>0;

считать приветствия и приветствия?

Обратите внимание, что я создал копии исходной переменной "char* p" и передал ее в качестве параметра в функцию strstr.

person Matthias    schedule 19.10.2014
comment
Я хочу думать о приветствии и приветствии, как будто это одно и то же слово. Если программа может найти слова приветствия, она возвращает ложь, если программа может найти слова приветствия, она возвращает ложь, но если программа может найти слова приветствия и приветствия, она возвращает истину. - person user3648443; 19.10.2014
comment
Я понимаю. Пожалуйста, перефразируйте свой вопрос, чтобы указать на это более явно, чтобы облегчить понимание для будущих читателей. - person Matthias; 19.10.2014

person    schedule
comment
спасибо за ваш ответ, но у меня все еще есть проблема. total возвращает 2 Но я хочу, чтобы он возвращал 1 . Как я могу это сделать ? - person user3648443; 19.10.2014
comment
@user3648443 user3648443 Нет смысла считать указанную вами строку. Я переписал. - person BLUEPIXY; 19.10.2014