我刚刚编写了一个程序,使用指针对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;
}
答案 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 ++。函数strspn
和strcspn
适用于通过集合分隔符进行标记。您可以使用strspn查找下一个分隔符的开始位置(即当前标记结束的位置),然后使用strcspn查找分隔符结束的位置(即下一个标记开始的位置)。循环直到你到达终点。