C strtok-与更多数据缓冲区一起使用

使用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);
    }
}
上一篇:c++中字符串分割(split)


下一篇:由编程珠玑字符串倒置问题拓展到split之C\C++实现