Я не понимаю, почему не работает функция strtok_s

Делаю лабу по программированию, сделал перебор и сравнение слов двух строк, основываясь, по большей части, на лекцию. Но почему-то работает неправильно. Я при помощи cout делал проверки внутри функции, и складывается ощущение, что как-то не так работает strtok_s. Понятное дело, что это я глупый, но помогите

вот код:

/* Присвоить переменной F значение true, если в предложении S1
   есть хотя бы одно слово, которое отсутствует в предложении S2
   и длина которого не превышает длину самого короткого слова S2,
   в противном случае присвоить переменной  F – false.*/
 

#include <iostream> 
using namespace std;

bool search(char* a, char* b);

int main()
{
    setlocale(LC_ALL, "Russian");
    char s1[40] = "AUD DUDUD UD31 AUL AUX UD31";
    cout << "Строка S1:" << endl << s1 << endl;
    char s2[40] = "AUD DUDUD AUD AU AUX";
    cout << "Строка S2:" << endl << s2 << endl;
    bool F = search(s1, s2);
    cout << "Значение переменной F: " << F << endl;
}

bool search(char* a, char* b)
{
    bool f = 0;
    char* m, * mp;
    m = strtok_s(b, " ", &mp);
    int minlen = strlen(m);
    while (m != NULL)
    {
        if (strlen(m) < minlen) minlen = strlen(m);
        m = strtok_s(NULL, " ", &mp);
    }
    cout << minlen << endl;
    char p3[80];
    p3[0] = NULL;       //копия b 
    char* p1, * pp1;
    char* p2, * pp2;
    p1 = strtok_s(a, " ", &pp1);
    while (p1 != NULL)
    {
        strcpy_s(p3, b);
        p2 = strtok_s(p3, " ", &pp2);
        while (p2 != NULL)
        {
            if (!strcmp(p1, p2))
            {
                if (strlen(p1) <= minlen)
                {
                    f = true;
                    break;
                }
            }
            p2 = strtok_s(NULL, " ", &pp2);
        }
        p1 = strtok_s(NULL, " ", &pp1);
    }
    return f;
}

Ответы (1 шт):

Автор решения: Harry

Давайте допишем два отладочных вывода:

cout << "b = [" << b << "]\n";
bool f = 0;
char* m, * mp;
m = strtok_s(b, " ", &mp);
int minlen = strlen(m);
while (m != NULL)
{
    if (strlen(m) < minlen) minlen = strlen(m);
    m = strtok_s(NULL, " ", &mp);
}
cout << "b = [" << b << "]\n";

И что мы видим?

Строка S2:
AUD DUDUD AUD AU AUX
b = [AUD DUDUD AUD AU AUX]
b = [AUD]
2

Вопросов больше нет?

strtok_s изменяет строку, с которой работает.

Кстати, судя по

    strcpy_s(p3, b);
    p2 = strtok_s(p3, " ", &pp2);

вы это знаете.

→ Ссылка