0

我有以下示例:

string name_data = "John:Green;96";

我需要解析string名称、string姓氏和int数据。我试过使用 sscanf,但它不起作用!

我该怎么做?

4

4 回答 4

1

您可以使用strtok()来首先提取以 结尾的元素,:然后使用以 结尾的元素;。剩下的将是96.

sscanf()是另一种选择,尽管我认为它不那么灵活。

于 2013-05-17T01:50:00.150 回答
0

不使用除该关联之外的任何辅助函数调用。使用字符串类,我们可以这样做:

size_t index = 0;
string firstName, surname, dataStr;
string tmpInput;
while (index!=name_data.length())
{
  // First identify the first name
  if (firstName.empty())
  {
    if (name_data[index] == ':')
    {
      firstName = tmpInput;
      tmpInput.clear();
    }
    else
      tmpInput.push_back(name_data[index]);
  }
  // Next identify the surname
  else if (surname.empty())
  {
    if (name_data[index] == ";")
    {
      surname = tmpInput;
      tmpInput.clear();
    }
    else 
      tmpInput.push_back(name_data[index]);
  }
  // Finally identify the integer as a string object
  else 
  {
    dataStr.push_back(name_data[index]);
  }
  index++;
}

将 dataStr 转换为 int 只是一个简单的 atoi() 调用或使用 stringstream 库。

于 2013-05-17T02:45:12.573 回答
0

如果你想用 sscanf 来做,你可以这样做:

string name_data = "John:Green;96";
char name_[256], surname_[256];
int data;
sscanf(name_data.c_str(), "%[^:]:%[^;];%d", name_, surname_, &data);
string name = name_, surname = surname_;

请注意,这假设您的姓名和姓氏最多只有 255 个字符,否则在将其转换为字符串之前,您需要一个更大的临时缓冲区。

"%[^:]:%[^;];%d"意味着读取一个字符串直到找到':',然后跳过那个':',然后读取一个字符串直到找到';',然后跳过那个';' 然后读取一个整数

您可以在此处找到其他功能/说明符。

于 2013-05-17T01:58:37.480 回答
0

您可以使用 stringstream 来获取您的令牌。该程序演示了如何做到这一点:

#include <sstream>
#include <iostream>
#include <string>

using namespace std;

int main() {
    string x = "John:Green;96";
    stringstream str(x);

    std::string  first;
    std::string  second;
    int          age;

    std::getline(str, first, ':');
    std::getline(str, second,';');
    str >> age;

    cout << "First: " << first << " Last: " << second << "  Age: " << age << endl;
}
于 2013-05-17T02:12:07.700 回答