[英]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 Split或Tokenizer算法。 但是如果你没有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.