【发布时间】:2019-05-11 07:48:22
【问题描述】:
我正在尝试修改 C++ 中的 strtok() 函数,如果在 char 指针遍历字符串时到达“#”字符,那么该字符之后的所有内容都将被忽略,并且函数不再返回任何内容。在我的代码中,我包含了额外的 if 语句,如果 char 指针到达“#”字符,则返回它之前的所有内容并使用 break 语句终止进程。一个 bool 变量也用于控制 main 函数中的循环,以便如果它改变值,它将防止无限循环。
但是,代码仍然会导致无限循环,我的思考过程也是如此。
#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;
}
【问题讨论】:
-
如果在 char 指针遍历字符串时到达 '#' 字符,则忽略该字符之后的所有内容 -- 为什么不简单地先修剪字符串垃圾字符,然后然后对其进行标记?这比尝试标记受污染的字符串要简单得多。
-
另外,您为什么要使用
C例程来执行此操作?为什么不一直坚持使用std::string并使用std::string?不用诉诸char *、strlen等。 -
标记化不是已经做了吗?如果我没记错的话,标记应该已经修剪了作为标记的垃圾字符的字符串。
-
您的方法非常混乱和费解。理智的方法是先确保字符串没有垃圾字符,然后开始标记化。这让整个事情变得简单多了。然后只需
mystring.erase(std::find(mystring.begin(), mystring.end(), '#'), mystring.end());摆脱所有垃圾,包括#。然后标记mystring。 -
我正在课堂上进行 shell 作业,网上的大部分资源都是 C 程序,并且使用 char* 指针而不是字符串。我可以使用字符串代替,但这对代码有什么帮助?
标签: c++ string shell token strtok