使用strtok函数时出现问题

时间:2011-02-07 10:53:48

标签: c++

大家早上好,:))

我在C ++中编写了一个从txt文件中读取信息的代码。它将第一行中的信息保存为字符串,然后我想使用此信息。我想读这个字符串,当它找到“|”时它必须跳到一个新的字符串。它很容易,但我在执行时遇到问题,我一直试图找到问题好几个小时而且我还没有成功。 :(我附上了代码。

提前感谢您的帮助。

#include <string>
#include <fstream>
#include <vector>
#include <iostream>

using namespace std;

int main()
{

    ifstream ifs( "C:\\a\\text.txt" );
    string temp;

    getline( ifs, temp ); 
    cout<<temp<<endl;

    string * pch;
    pch = strtok (temp,"|");

    while (pch != NULL)
    {
        printf ("%s\n",pch);
        pch = strtok (NULL, "|");
    }

    system("pause");
    return 0;

}

4 个答案:

答案 0 :(得分:1)

strtok适用于char *,而不是字符串* 。这可能是您遇到问题的原因。

由于您使用c ++实现此功能,我建议您使用字符串函数而不是strtok:

int main()
{

    ifstream ifs( "C:\\a\\text.txt" );
    string temp;

    getline( ifs, temp ); 
    cout<<temp<<endl;

    size_t tokenPos = temp.find("|");   

    while (tokenPos != string::npos)
    {
        cout << temp.substr(0, tokenPos) << endl;
        temp.erase(0, tokenPos+1);
        tokenPos = temp.find("|");  
    }

    system("pause");
    return 0;

}

要将文字存储在评论中描述的值中,您需要执行以下操作:

int main() 
{ 
    ifstream ifs( "C:\\a\\text.txt" ); 

    int id; 
    int type; 
    int columns; 
    string temp; 

    getline( ifs, temp ); 
    cout<<temp<<endl; 

    size_t tokenPos = temp.find("|");
    while (tokenPos != string::npos) 
    { 
        int i=0; 
        tokenPos = temp.find("|"); 
        cout << temp.substr(0, tokenPos) << endl; 

        if(i==0)
        { 
            id = atoi(temp.substr(0, tokenPos).c_str()); 
        }
        else if(i==1) 
        { 
            type = atoi(temp.substr(0, tokenPos).c_str()); 
        } 
        else if(i==2) 
        { 
            columns = atoi(temp.substr(0, tokenPos).c_str()); 
        } 

        ++i; 
        temp.erase(0, tokenPos+1); 
    } 

    cout << "ID: " << id << ", Type: " << type << ", Columns: " << columns << endl; 
    system("pause"); 
    return 0; 
}

答案 1 :(得分:1)

有许多方法可以标记std :: string。这是一种方式;我选择这个主要是因为它简单且独立:

int main() {
  using namespace std;
  ifstream ifs("C:/a/text.txt");
  vector<string> bits;  // if you want to save to process
  for (string temp; getline(ifs, temp, '|');) {
    bits.push_back(temp);
    cout << temp << '\n';  // if you want to output each as processed
  }
  return 0;
}

答案 2 :(得分:0)

您可以在question中找到一些方法。当您使用C ++时,通常不是诉诸C风格函数的方法。关于您的代码,请尝试向我们提供确切的错误。它有帮助...

我在你的代码中看到了很多问题。以下是C++ reference的一个工作示例:

/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
    char str[] ="- This, a sample string.";
    char * pch;
    printf ("Splitting string \"%s\" into tokens:\n",str);
    pch = strtok (str," ,.-");
    while (pch != NULL)
    {
        printf ("%s\n",pch);
        pch = strtok (NULL, " ,.-");
    }
    return 0;
}

正如文档中所述,你需要给strtok一个非const c-string,因为它会修改它以处理令牌。

MY2C

答案 3 :(得分:0)

尝试更改此行

  pch = strtok (temp,"|");

  pch = strtok (temp.c_str(),"|");

strtok取char *(c-style string)not :: std :: string(c ++ string)。

<强> UPDATE2 我的错。我没有用过strtok这么久。 好。 试试这个:

char* s = new char[temp.size() + 1];
memcpy(s, temp.c_str(), temp.size() + 1);  // copy c-style string with '\0' at the end
const char* pch = strtok(s, "|");
...
delete[] s;