使用strtok()函数几乎没有问题.
我正在解析两个文件.首先,我将文件1加载到缓冲区中.该文件包含我需要加载的第二个文件的名称.逐行读取两个文件.我的代码如下所示:
char second_file_name[128] = { "" };
char * line = strtok( buffer, "\n" );
while( line != NULL )
{
if ( line[0] = 'f' )
{
sscanf( line, "%*s %s", &second_file_name );
LoadSecondFile( second_file_name );
}
// processing other lines, not relevant for question
line = strtok( NULL, "\n" );
}
虽然LoadSecondFile(…)函数的工作方式几乎相同,但是:
char * line = strtok( buffer, "\n" );
while( line != NULL )
{
// process file data
line = strtok( NULL, "\n" );
}
我的问题是,在调用LoadSecondFile(…)函数后,用于解析第一个文件的strtok()指针被“弄乱了”.与其给我第二个文件名之后的行,不给我任何东西-理解为“完全废话”.我是否正确理解这是由于strtok()指针不仅在函数中在程序*享,还是在程序*享?如果是这样,我该如何在解析第二个文件之前“备份”用于解析第一个文件的strtok()指针?
感谢您的任何建议.
干杯.
解决方法:
strtok是一个邪恶的小函数,它维护全局状态,因此(如您所发现的)您不能同时标记两个字符串.在某些平台上,名称如strtok_r或strtok_s的邪恶变体较少;但是既然您在编写C而不是C,为什么不使用C库呢?
ifstream first_file(first_file_name); // no need to read into a buffer
string line;
while (getline(first_file, line)) {
if (!line.empty() && line[0] == 'f') { // NOT =
istringstream line_stream(line);
string second_file_name;
line_stream.ignore(' '); // skip first word ("%*s")
line_stream >> second_file_name; // read second word ("%s")
LoadSecondFile(second_file_name);
}
}