繁体   English   中英

问题strtok在c ++中

[英]problem strtok in c++

我在使用c ++中的strtock时遇到问题我需要从文件中读取以下行

6:00,6:20,6:40,7:00,7:20,7:40,8:00,8:50,9:40,10:30,11:20,12:00的长度这条线是未知的(我不知道我有多少参数);

我尝试做这个功能:

void RailwayLine::initilizeLoz(char line[1024])
 {

  char * pch;
  char * timeReader;
  Hour *hour;
  char * pch2=NULL;
  int time;
  int minute;
  char line2[1024];
  strcpy(line2,line);
  pch = strtok (line2,",");
 while (pch != NULL)
   {
    delete pch2;
    pch2= new char(strlen(pch)+1);
    if(pch2!=NULL)
   strcpy(pch2,pch);
    timeReader = strtok (pch2,":");
    time=atoi(timeReader);
    timeReader = strtok (NULL,":");
    minute=atoi(timeReader);
    hour=new Hour(time,minute);

           this-> UpdateLoz((*hour));

             pch=strtok(NULL,",");


   }


 }

但它不起作用。 itj只读取第一个参数(7:10)! 什么可以是什么问题? 我该如何改进我的代码? 谢谢

您不能嵌套strtok调用,因为该函数在调用之间保持内部状态。 请改用strtok_r

您可以改进代码的绝对最佳方法是停止使用stroke并使用利用您正在使用的语言的强大功能。 Boost有一个tokenizer和其他库,可能真正满足您的需求(如正则表达式)。

中风的stroke不是好玩的; 这是你的大脑中的那种。 可怕的,可怕的功能,其设计可以追溯到编程的黑暗时代。 它有严重和永久性的问题,使它不仅过时,而且危险......正如你在这里看到的那样。 停止尝试通过将岩石和棍棒粘在一起来制造东西。 进入现代时代,我们有锻造和机器人技术。 拯救你的大脑!

我使用Boost SplitTokenizer算法。 但是如果你没有Boost可用,你可以这样做:

std::istringstream iss(line);
std::string departure;
while (getline(iss, departure, ','))
{
    // departure has one time in it;
    // do what you will with it
}

我不认为你可以按照你所做的那样嵌套strtok - 当你启动搜索“:”时它会忘记你之前选择逗号分隔项的实例。

这样就可以了。


void tokenize( std:: string stringToTokenize ) {

    char* pch = new char [ (stringToTokenize.length()) + 1 ];

    std:: strcpy( pch, stringToTokenize.c_str() ) ;

    pch = std:: strtok( pch, "," ) ;

    std::cout << std::endl ;

    while( pch != NULL ) {

    std::cout << pch << std::endl ;
    pch = strtok( NULL, "," ) ;

    }

}

int main( int argc, const char* argv[] ) {

std:: string s1 ; std:: getline( std::cin, s1 ) ; tokenize( s1 ) ; return 0 ;

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM