我有以下示例:
string name_data = "John:Green;96";
我需要解析string
名称、string
姓氏和int
数据。我试过使用 sscanf,但它不起作用!
我该怎么做?
您可以使用strtok()
来首先提取以 结尾的元素,:
然后使用以 结尾的元素;
。剩下的将是96
.
sscanf()
是另一种选择,尽管我认为它不那么灵活。
不使用除该关联之外的任何辅助函数调用。使用字符串类,我们可以这样做:
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 库。
如果你想用 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;
}