• 文章
  • 如何将文本分割成两个或更多字符
发布者:
2012 年 8 月 10 日(最后更新:2012 年 8 月 10 日)

如何将文本分割成两个或更多字符

评分:3.6/5(132 票)
*****
我只想警告你不要使用 Sean Genge 撰写的类似 文章 中的代码。我不知道如何正确地写,因为论坛关闭了,我无法在上面发表评论。

总的来说,可以使用 STL 和 C++ 非常轻松地分割字符串。你可以在 STL 中找到两个不同的 'getline' 函数。一个来自 std::iostream,需要 char 缓冲区,并且不太方便;另一个是 std::string 中的公共函数,允许定义终止字符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <string>
#include <iostream>
#include <sstream>

int main(int argc, char** arv)
{
    // initialize input stream with data
    std::istringstream ins("this is a    text");
    
    // load words to this container
    std::string out;
    
    // read the words until some data in the input stream
    while (ins.good())
    {
        getline(ins, out, ' '); // tell getline to stop on ' ' character
        if (!out.empty())       // just fast way to remove unnecessary spaces
            std::cout << out << std::endl;
    }
    return 0;
}


另一种方法是仅使用 ANSI。稍微危险一点,但会更快。使用 'strtok' 函数。在术语中:单词就是标记。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv)
{
    // this function will stop on any of these characters
    char const delimiters[] = " \t\n\r";
    
    // initial string to split    
    char ins[] = "this is a    text";
    
    // this pointer will point to the next word after every 'strtok' call
    char *tok = strtok(ins, delimiters);
    
    // if returned pointer is NULL, then there is no more words
    while (0 != tok)
    {
        puts(tok); // print the word
        tok = strtok(NULL, delimiters); // move to the next one
    }
    return 0;
}


两个程序都将返回
this
is
a
text

可以使用类似 sscanf 的函数将字符串分割成几部分,但为此你必须知道项目的类型,有时还需要知道它们的数量。不要发明别人已经完成并且被证明稳定的代码。祝你好运