用标记解析字符串的函数

时间:2011-06-08 15:18:12

标签: c++ parsing

我知道如何用C#和VB编程,但不知道如何使用C ++,并且必须为使用C ++的条形码扫描器编写一个小程序:(

在这一刻我尝试解析一个扫描条码,其中有多个数据用“/”分隔,我发现存在一个strtok函数,“手动”测试它并且工作正常但我还没有实现一个工作函数来调用它正确,我现在拥有:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int elemStr(char *str, char sep)
{
   int cantElem;
   unsigned ich;

   cantElem = 0;

   if (strlen(str) > 0) //at least 1 elem
      cantElem++;

   for (ich = 0; ich < strlen(str); ich++)
   {         
      if (str[ich] == sep)
         cantElem++;      
   }                
   return cantElem;
}

char* getElemStr(char *str, char sep[], int elem)
{   
    char *tempStr = NULL;
    char *tok;                   
    int currElem = 1;

    // 1st data
    strcpy( tempStr, str);
    tok = strtok( tempStr, sep);

    while( currElem != elem )
    {       
        // Get next tokens:
        tok = strtok( NULL, sep );
        currElem++;
    }

    return tok;
}


void main( void )
{
    char barcode[] = "710015733801Z/1/35";

    char sep[] = "/";
    char sep1 = sep[0];

    char barcd[20];
    char piezaChar[4];
    int pieza;
    char mtsChar[4];

    int cantElem;

    cantElem = elemStr(barcode, sep1 );

    if (cantElem >= 1)
    {
        strcpy(barcd, getElemStr(barcode,sep,1) ); //pasa a str resultado;
        printf("Cod: %s\n", barcd ); //STACK OVERFLOW HERE!
    }
 }

如果我使用strtok以及函数“getElemStr”它可以正常工作但我也尝试在其他地方使用它。

我可以像这样使用strtok吗?你有一个有效的例子吗? pd:我不知道指针(对不起),好的文档要了解它?

3 个答案:

答案 0 :(得分:3)

由于您特别询问了C ++,我将忽略您的c风格代码,并向您展示如何在C ++中执行此操作:

#include <boost/algorithm/string.hpp>
#include <iostream>
#include <string>
#include <vector>

int main()
{
    std::string barcode = "710015733801Z/1/35";

    std::string sep = "/";
    std::vector<std::string> v;
    boost::split(v, barcode, boost::is_any_of(sep));

    for(size_t i=0; i<v.size(); ++i)
        std::cout << v[i] << '\n';
}

答案 1 :(得分:2)

strtok会破坏原始字符串。所以我认为它不能与指向静态字符串的char *一起使用。静态字符串被复制到可执行文件的只读部分。

答案 2 :(得分:0)

这是一个不使用boost的C ++解决方案。

#include <string>
#include <sstream>
#include <iostream>

int main()
{
    std::string barcode = "710015733801Z/1/35";

    std::stringstream ss(barcode);
    std::string elem;

    while(std::getline(ss, elem, '/'))
    {
        //do something else meaningful with elem
        std::cout << elem << std::endl;
    }

    return 0;
}

输出:

710015733801Z
1
35