Я пытаюсь изменить функцию 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;
}