如何使用每个分隔符来完成这项工作? - C ++

时间:2010-02-08 05:06:26

标签: c++ delimiter arrays

我刚刚编写了一个程序,使用指针对char数组进行标记。该程序只需要使用空格作为分隔符。我刚刚把它转过来并得到了充分的信任,但在转入之后我意识到如果分隔符是一个空格,这个程序只有才能工作。

我的问题是,如何让这个程序与每个分隔符一起使用?

我在下面显示的函数返回一个指向char数组中下一个单词的指针。如果要使用所有分隔符,我认为我需要更改。

谢谢!

代码:

char* StringTokenizer::Next(void)
{
pNextWord = pStart;

if (*pStart == '\0') { return NULL; }

while (*pStart != delim)
{
    pStart++;
}

if (*pStart == '\0') { return NULL; }

*pStart = '\0';
pStart++;

return pNextWord;
}

主要的打印循环:

// this loop will display the tokens
while ( ( nextWord = tk.Next ( ) ) != NULL )
{
    cout << nextWord << endl;
}

5 个答案:

答案 0 :(得分:1)

最简单的方法是改变你的

while (*pStart != delim)

类似

while (*pStart != ' ' && *pStart != '\n' && *pStart != '\t')

或者,您可以对字符串进行delim,并创建一个函数来检查字符串中是否包含char:

bool isDelim(char c, const char *delim) {
   while (*delim) {
      if (*delim == c)
         return true;
      delim++;
   }
   return false;
}

while ( !isDelim(*pStart, " \n\t") ) 

或者,也许最好的解决方案是使用其中一个预建功能来完成所有这些,例如strtok

答案 1 :(得分:1)

只需更改

while (*pStart != delim)

到这一行

while (*pStart != '\0' && strchr(" \t\n", *pStart) == NULL)

标准strchr函数(在string.h标头中声明)在C字符串中查找一个字符(作为第二个参数给出)(作为第一个参数给出)并返回指向该字符串的字符串首先出现该角色的位置。所以strchr(" \t\n", *pStart) == NULL表示在字符串*pStart中找不到当前字符(" \t\n"),而不是分隔符! (当然,更改此分隔符字符串" \t\n"以使其适应您的需要。)

这个解决方案是一种简短的方法来测试一组(通常是小的)给定有趣字符中的给定字符。它使用标准功能。

顺便说一句,你不仅可以使用C-string,还可以使用std::string。您只需要使用const std::string声明" \t\n" - 类似值,然后将strchr替换为声明的分隔符字符串的find方法。

答案 2 :(得分:0)

嗯......这看起来不太合适:

if (*pStart = '\0')

这种情况永远不会成真。我猜你打算==而不是=?你在这里也遇到了一些问题:

while (*pStart != delim)

如果字符串中的最后一个单词后面没有分隔符,那么这将在字符串的末尾运行,这将导致严重的问题。

编辑:除非您确实需要自己动手,否则请考虑使用字符串流来完成工作。它已经拥有了所有正确的机制并经过了大量的测试。它确实增加了开销,但在很多情况下它都是可以接受的。

答案 3 :(得分:0)

未编译。但我会做这样的事情。

 //const int N = someGoodValue;
char delimList[N] = {' ',',','.',';', '|', '!', '$', '\n'};//all delims here.

char* StringTokenizer::Next(void)
{
    if (*pStart == '\0') { return NULL; }

    pNextWord = pStart;

    while (1){  
        for (int x = 0; x < N; x++){
            if (*pStart == delimList[x]){ //this is it.
                *pStart = '\0';
                pStart++;
                return pNextWord;
            }

        }
        if ('\0' == *pStart){ //last word.. maybe.
                return pNextWord;   
        }
        pStart++;
    }
}

// (!compiled).

答案 4 :(得分:0)

我认为我们想要坚持使用C而不是C ++。函数strspnstrcspn适用于通过集合分隔符进行标记。您可以使用strspn查找下一个分隔符的开始位置(即当前标记结束的位置),然后使用strcspn查找分隔符结束的位置(即下一个标记开始的位置)。循环直到你到达终点。