【问题标题】:Problems using strtok() and stringstream使用 strtok() 和 stringstream 的问题
【发布时间】:2013-04-22 23:10:20
【问题描述】:

我一直在摆弄这个,它返回的只是'save.rp'文件中不同行的前两个数字,

int characterPosition [2] = {0,0};

string convToStr(char *ch)
{
    stringstream ss;
    string res;
    ss << ch;
    ss >> res;
    return res;
}

int convToInt(string ch)
{
    stringstream ss(ch);
    int num;
    ss >> num;
    return num;
}

void loadSave()
{
    string loadPos;
    ifstream file("save.rp");
    if ((file.is_open())&&(file.good()))
    {
        getline(file,loadPos);
    }
    file.close();

    char str[] = {*loadPos.c_str()};
    char delim[] = "-";
    char *result = NULL;
    result = strtok(str, delim);
    int num = 0;
    while (result != NULL)
    {
        characterPosition[num] = convToInt(convToStr(result));
        cout << characterPosition[num] << endl;
        result = strtok(NULL, delim);
    }
}

“save.rp”文件如下所示:400-2000

它应该分别返回每个数字,在这种情况下是 400 和 2000。

我在这里做了什么傻事吗?

【问题讨论】:

  • 你是什么意思看起来像这样:400-2000?
  • 这就是它所包含的(抱歉不清楚)
  • 所以它包含 2 个数字 - 400 和 2000。所以你的问题是“它返回的只是前两个数字”。还是您的意思是它包含从 400 到 2000 的所有数字?每个数字是否单独一行。
  • 它只返回 4 和 0,它们是分开的。它应该返回 400,然后是 2000

标签: c++ c fstream stringstream strtok


【解决方案1】:

这一行

char str[] = {*loadPos.c_str()};

等价于

char str[] = {'4'};

这显然不是你想要的,你想要的

char str[] = "400-2000";

这样做

char str[500];                  // assuming your line length dont exceed 500
strcpy( str, loadPos.c_str() );

【讨论】:

  • 打败我这么多......有点惊讶strtok并没有做可怕的事情,但也许他只是幸运。 :)
  • 非常感谢!你不仅帮了我,而且我现在知道我做错了什么!
【解决方案2】:

问题来了

char str[] = {*loadPos.c_str()};

loadPos.cstr()返回一个指向“400-2000”的指针; * 取消引用并给出第一个字符 - 即“4”。 您使用第一个字符“4”初始化 str[]。 str 现在是一个以 '4' 开头的数组,天知道之后会发生什么。您所有的操作都在此完成。

将上面的行改为

char str[100];
strcpy(str,loadPos.c_str());

这里是如何避免 strtok 和 convToStr

int convToInt(string ch)
{
   stringstream ss(ch);
    int num;
    ss >> num;
    return num;
}

void loadSave()
{
    string loadPos;
    ifstream file("save.rp");
    if ((file.is_open())&&(file.good()))
    {
        getline(file,loadPos);
    }
    file.close();

    stringstream ss(loadPos);
    string token;

    while(getline(ss, token, '-'))
    {
        int r = convToInt(token);
        cout<<r<<endl;
    }

}

【讨论】:

  • @MichaelB。更新答案以避免strtok。没有任何理由在 C++ 中使用 strtok
【解决方案3】:
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main() {
    ifstream inf("save.rp");
    int characterPosition [2] = {0,0};
    int num=0;
    string line_buff;
    while(inf.good()){
        getline(inf, line_buff, '-');
        stringstream ss(line_buff);
        ss >> characterPosition[num++];
    }
    cout << characterPosition[0] << ',' << characterPosition[1] << endl;
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多