查找字符串中所有出现的字符

lod*_*kkx 4 c++ algorithm stl vector

我有逗号分隔的字符串,我需要从中提取值.问题是这些字符串永远不会是固定大小.所以我决定迭代逗号组并阅读其间的内容.为了做到这一点,我创建了一个函数,它返回样本字符串中每个匹配项的位置.

这是一个聪明的方法吗?这被认为是不好的代码吗?

#include <string>
#include <iostream>
#include <vector>
#include <Windows.h>

using namespace std;

vector<int> findLocation(string sample, char findIt);

int main()
{
    string test = "19,,112456.0,a,34656";
    char findIt = ',';

    vector<int> results = findLocation(test,findIt);
    return 0;
}

vector<int> findLocation(string sample, char findIt)
{
    vector<int> characterLocations;
    for(int i =0; i < sample.size(); i++)
        if(sample[i] == findIt)
            characterLocations.push_back(sample[i]);

    return characterLocations;
}
Run Code Online (Sandbox Code Playgroud)

小智 12

vector<int> findLocation(string sample, char findIt)
{
    vector<int> characterLocations;
    for(int i =0; i < sample.size(); i++)
        if(sample[i] == findIt)
            characterLocations.push_back(sample[i]);

    return characterLocations;
}
Run Code Online (Sandbox Code Playgroud)

正如目前所写,如果我正确地阅读你的问题,这将简单地返回一个包含字符本身的int表示的向量,而不是它们的位置,这正是你真正想要的.

替换此行:

characterLocations.push_back(sample[i]);
Run Code Online (Sandbox Code Playgroud)

用这一行:

characterLocations.push_back(i);
Run Code Online (Sandbox Code Playgroud)

这应该会给你你想要的矢量.

  • 请将顶行更改为vector <int> findLocation(const string&sample,char findIt).我们不想复制字符串 (4认同)

Dou*_* T. 6

如果我正在审查这个,我会看到这一点,并假设你真正想做的是标记一个字符串,并且已经有很好的方法来做到这一点.

我见过这样做的最佳方式是boost::tokenizer.它允许您指定字符串的分隔方式,然后为您提供一个很好的迭代器接口来迭代每个值.

using namespace boost;
string sample = "Hello,My,Name,Is,Doug";
escaped_list_seperator<char> sep("" /*escape char*/, ","/*seperator*/, "" /*quotes*/)

tokenizer<escaped_list_seperator<char> > myTokens(sample, sep)

//iterate through the contents
for (tokenizer<escaped_list_seperator<char>>::iterator iter = myTokens.begin();
     iter != myTokens.end();
     ++iter)
{
    std::cout << *iter << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

输出:

Hello
My
Name
Is
Doug
Run Code Online (Sandbox Code Playgroud)

编辑如果您不希望依赖于提升,您也可以使用此答案中getlineistringstreamas .要从那个答案中复制一下:

std::string str = "Hello,My,Name,Is,Doug";
std::istringstream stream(str);
std::string tok1;

while (stream)
{
    std::getline(stream, tok1, ',');
    std::cout << tok1 << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

输出:

 Hello
 My
 Name
 Is
 Doug
Run Code Online (Sandbox Code Playgroud)

这可能不是你要问的直接问题,但我认为它会解决你正试图解决的整体问题.