在将操作分配给数学运算符后,如何将字符串拆分为两部分?例如4567 * 6789我想将字符串分成三部分 第一名:4567操作:*第二名:6789 输入来自textfile
char operation;
while (getline(ifs, line)){
stringstream ss(line.c_str());
char str;
//get string from stringstream
//delimiter here + - * / to split string to two part
while (ss >> str) {
if (ispunct(str)) {
operation = str;
}
}
}
答案 0 :(得分:2)
也许,只是也许,通过思考这个问题,我们可以提出一个解决方案。
我们知道operator>>
在遇到不是数字的字符时会停止处理。所以我们可以使用这个事实。
int multiplier = 0;
ss >> multiplier;
下一个字符不是数字,因此它们可以是操作符 如果我们读到一个角色会发生什么:
char operation = '?';
ss >> operation;
哦,我忘了提到operator>>
默认会跳过空格。
最后,我们可以输入第二个数字:
int multiplicand = 0;
ss >> multiplicand;
要确认,请打印出我们读过的内容:
std::cout << "First Number: " << multiplier << "\n";
std::cout << "Operation : " << operation << "\n";
std::cout << "Second Number: " << multiplicand << "\n";
在这里使用调试器将有助于显示正在发生的事情,因为每个语句都会被执行,一次是一个。
编辑1:更复杂
您总是可以变得更复杂并使用解析器,词法分析器或编写自己的。一种好的实现方法是使用状态机。
例如,您将读取单个字符,然后根据状态决定如何处理它。例如,如果字符是数字,则可能需要构建数字。对于角色(除了空白区域),将其转换为标记并将其存储在某处。
有解析树和其他数据结构可以简化解析操作。还有解析库,例如boost::spirit
,yacc,bison,flex和lex。
答案 1 :(得分:0)
一种方法是:
char opr;
int firstNumber, SecondNumber;
ss>>firstNumber>>opr>>SecondNumber;
而不是:
while (ss >> str) {
if (ispunct(str)) {
operation = str;
}
}
答案 2 :(得分:0)
如果您手边有一个字符串,您可以简单地将字符串左右分割为操作员位置,如下所示:
ImportError: libcudnn.5: cannot open shared object file: No such file or directory
答案 3 :(得分:0)
一个简单的解决方案是使用sscanf
:
int left, right;
char o;
if (sscanf("4567*6789", "%d%c%d", &left, &o, &right) == 3) {
// scan valid...
cout << left << " " << o << " " << right;
}
答案 4 :(得分:0)
我的职责是创造功能:
std::size_t delimiter_pos(const std::string line)
{
std::size_t found = std::string::npos;
(found = line.find('+')) != std::string::npos ||
(found = line.find('-')) != std::string::npos ||
(found = line.find('*')) != std::string::npos ||
(found = line.find('/')) != std::string::npos;
return found;
}
计算操作数的第二个函数:
void parse(const std::string line)
{
std::string line;
std::size_t pos = delimiter_pos(line);
if (pos != std::string::npos)
{
std::string first = line.substr(0, pos);
char operation = line[pos];
std::string second = line.substr(pos + 1, line.size() - (pos + 1));
}
}
我希望我的例子帮助你