【问题标题】:How can I neglect everything after a character in a string?我怎么能忽略字符串中一个字符之后的所有内容?
【发布时间】: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


【解决方案1】:
    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.
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多