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++中有更好的技术和它的坏主意,因为它会改变底层字符串。它还保持内部全局状态,这使得在多线程情况下使用它很烦人(但你可以通过使用它来解决)。