Как я могу пренебречь всем после символа в строке? - PullRequest
0 голосов
/ 11 мая 2019

Я пытаюсь изменить функцию strtok () в C ++, где, если символ «#» достигается, когда указатель на символ перебирает строку, то все, что находится после этого символа, игнорируется и больше ничего не возвращается из функции.В своем коде я включил дополнительный оператор if, который, если указатель на символ достигает символа «#», возвращает все перед ним и завершает процесс с помощью оператора break.Переменная bool также используется для управления циклом в главной функции, так что если она изменит значение, это предотвратит бесконечный цикл.

Однако код все равно приводит к бесконечному циклу, как и мой мыслительный процесс.

#include <iostream>
#include <string>

using namespace std;
char *userdefine_strtok(char *arg, string delimiter, bool &breaker)
{
    static int pos = 0;
    static char* buf = 0;
    static char* token = 0;

    if (arg)
    {
        //start a new search
        pos = 0;
        buf = arg;

        //delete previous token if any
        if (token) delete token;

        //create token at least as big as the argument
        token = new char[strlen(buf) + 1];
    }

    if (!buf)
        return 0;

    if (pos >= strlen(buf))
        return 0;

    //prepare the token
    memset(token, 0, strlen(buf) + 1);

    int i = 0;
    while (pos < strlen(buf))
    {
        for (int j = 0; j < delimiter.length(); j++) {
        if (buf[pos] == delimiter[j])
        {
            pos++;
            return token;
        }

        }

        if (buf[pos] == '#')
        {
            return token; //return everything before character
            breaker = false; //bool is false so while loop in main will not continue
            break;//break out of the current loop
        }

        token[i] = buf[pos];
        i++;
        pos++;


    }

    return token;
}

int main()
{
    bool stopper = true;
    char *buf = "hello,world#1a,2!b,3c";
    cout << "String is :" << buf << endl << endl;
    char *token = userdefine_strtok(buf, ",!", stopper);
    while (token && stopper)
    {
        std::cout << token << "\n";
        token = userdefine_strtok(NULL, ",!", stopper);

    }


    system("PAUSE");
    return 0;
}


1 Ответ

0 голосов
/ 11 мая 2019
    if (buf[pos] == '#')
    {
        return token; //return everything before character
        breaker = false; //bool is false so while loop in main will not continue
        break;//break out of the current loop
    }

Все после оператора return игнорируется, поэтому вам нужно расположить его так:

    if (buf[pos] == '#')
    {
        breaker = false; //bool is false so while loop in main will not continue
        return token; //return everything before character
        //break; This line is useless.
    }
...