4

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;
}

中的打印循环main()

while ((nextWord = tk.Next()) != NULL) {
    cout << nextWord << endl;
}
4

5 回答 5

1

换行就好

while (*pStart != delim)

如下:

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

标准strchr函数(在string.h标题中声明)在 C 字符串(在第一个参数中给出)中查找一个字符(在第二个参数中给出)并返回一个指向该字符第一次出现的位置的指针。因此,如果在字符串中找不到strchr(" \t\n", *pStart) == NULL当前字符 ( )并且因此不是分隔符,则表达式 为真。(当然,修改分隔符字符串以使其适应您的需要。)*pStart" \t\n"

这种方法提供了一种简短的方法来测试给定字符是否属于(小)感兴趣的字符集。它使用标准功能。

顺便说一句,您不仅可以使用 C 字符串,还可以使用std::string. 您只需要声明一个const std::string with " \t\n"-like 值,然后用声明的分隔符字符串strchr 的方法替换对函数的调用。find

于 2010-02-08T11:16:51.520 回答
1

最简单的方法是改变你的

while (*pStart != delim)

类似于

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

或者,您可以将 delim 设为字符串,并创建一个函数来检查字符串中是否包含字符:

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

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

或者,也许最好的解决方案是使用其中一个预构建的函数来完成这一切,例如strtok

于 2010-02-08T05:17:53.717 回答
0

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

于 2010-02-08T11:41:37.410 回答
0

嗯......这看起来不太正确:

if (*pStart = '\0')

条件永远不可能为真。我猜你打算==而不是=?你这里也有一点问题:

while (*pStart != delim)

如果字符串中的最后一个单词后面没有定界符,这将超出字符串的末尾,这将导致严重的问题。

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

于 2010-02-08T05:18:42.093 回答
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).
于 2010-02-08T08:42:02.037 回答