C++ 如何在C++;?

C++ 如何在C++;?,c++,string,parsing,C++,String,Parsing,我举了以下例子: string name_data = "John:Green;96"; 我需要解析字符串名称、字符串姓氏和int数据。我尝试过使用sscanf,但它不起作用 我应该怎么做?您可以先提取以结尾的元素:,然后提取以结尾的元素。剩下的将是96 sChanff()/Script >是另一种选择,虽然我不认为它是相当灵活的。 < P>如果你想用sSCANF来做,你可以这样做: string name_data = "John:Green;96"; char name_[256],

我举了以下例子:

string name_data = "John:Green;96";
我需要解析
字符串
名称、
字符串
姓氏和
int
数据。我尝试过使用sscanf,但它不起作用

我应该怎么做?

您可以先提取以
结尾的元素:
,然后提取以
结尾的元素。剩下的将是
96


<代码> sChanff()/Script >是另一种选择,虽然我不认为它是相当灵活的。

< P>如果你想用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”
表示读取字符串直到找到“:”,然后跳过“:”,然后读取字符串直到找到“;”,那就跳过那个“;”然后读取一个整数


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

您可以使用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;
}
#包括
#包括
#包括
使用名称空间std;
int main(){
字符串x=“约翰:格林;96”;
stringstream(x);
std::首先是字符串;
std::字符串秒;
智力年龄;
std::getline(str,第一个“:”);
std::getline(str,第二个“;”);
str>>年龄;

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

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库。

包括您尝试的代码,即使它不起作用。这可能会帮助您:我多么喜欢Qt.QStringList str=QString(name_data).split(QRegExp(“[:;]”);您可以使用
std::getline(str,dst,,:'))<代码> >从代码< > STR <代码>到代码> dSt>代码>字符>代码>:“我同意,谢谢.BooDig.”代码> Strtok()/Script >是一个PosikBeasue.修改底层字符串. C++还具有流运算符的更好选项.我已经成功地使用<代码> Strtok()编写了各种解析代码
,所以你关于它是“松树”的建议必须与你是如何做到的有关。显然,
strtok()
并不适用于每一种情况。但最初给出的描述中没有任何内容会妨碍使用
strtok()
。我不满意你不能做到。你显然可以做到(你可以在C中编写所有代码;它的可能,但是一个松树:)。我说,C++中有更好的技术和它的坏主意,因为它会改变底层字符串。它还保持内部全局状态,这使得在多线程情况下使用它很烦人(但你可以通过使用它来解决)。