Strtok():标记字符串

时间:2015-03-07 20:17:12

标签: c++

我一直收到一条错误,上面写着"没有匹配功能来拨打' strtok'"。我不太擅长编码而且很困惑D:

来自文件I的行的示例' m来自: Wilco Wilco 2009 Nonesuch Records 11 58 Rock

int find_oldest_album(Album **& albums, int num_of_albums){
    string line;
    ifstream fin;
    fin.open("/Users/ms/Desktop/albums.txt");
    while (!fin.eof())
    {
        getline(fin, line, '\n');
        char * artist_name;
        char artist_name = strtok(line, '\t');
        char * title_name;
        title_name = strtok(NULL, '\t');
        char  * release_year;
        release_year = strtok(NULL, '\t');
    }


    fin.close();
}

3 个答案:

答案 0 :(得分:1)

strtok函数可能仅适用于字符数组。它是C标准功能。如果要在使用标题std::string中声明的标准流类strtok时使用与std::istringstream相同的方式解析<sstream>类型的对象

例如

#include <sstream>

//...

std::string line;
std::getline( fin, line, '\n' );

std::istringstream is( line );

std::string artist_name;
std::getline( is, artist_name, '\t' );

至于你的代码,那么它包含很多错误。

例如在这两个陈述中

   char * artist_name;
   char artist_name = strtok(line, '\t');

有三个错误。您正在重新声明名称artist_name,函数strtok不能与std::string类型的对象一起使用,函数strtok的第二个参数(分隔符)必须指定为字符串,它的类型为{{1 }}

答案 1 :(得分:1)

strtok是一个损坏的C函数,不应该使用。它需要一个 可写C字符串( std::string),它具有静态状态,即 很容易被腐蚀。

如果您的行有标准分隔符,例如制表符, 编写一个函数可以很容易地将它们分解成字段:

std::vector<std::string>
split( std::string const& line )
{
    std::vector<std::string> results;
    std::string::const_iterator end = line.end();
    std::string::const_iterator current = line.start();
    std::string::const_iterator next = std::find( current, end, '\t' );
    while ( next != end ) {
        results.push_back( std::string( current, next ) );
        current = next + 1;
        next = std::find( current, end, '\t' );
    }
    results.push_back( std::string( current, end ) );
    return results;
}

更一般地说,对于任何解析问题,只需遍历 字符串,如上所述。

答案 2 :(得分:0)

使用C ++的更好的解决方案由莫斯科的回答中的vlad概述。解决错误&#34;没有匹配的功能来呼叫&#39; strtok&#39;&#34;您需要包含头文件,如下所示:

#include<cstring>