gpt4 book ai didi

c++ - 解析复杂的字符串

转载 作者:太空狗 更新时间:2023-10-29 20:30:00 26 4
gpt4 key购买 nike

我需要按以下顺序读取一个字符串:

  1. 读取由空格分隔的任意数量的数字,丢弃除最后一个以外的所有数字,将其保存到 n
  2. 读取一个空格后接n个字符后跟空格,只保存字符
  3. 再读取两个用空格隔开的数字并保存

我想过使用字符串流来读取数字并在字符串处停止,但我不知道如何预测字符串流中的字符串并停止读取数字而不将字符串“读取”为数字并终止字符串流.
如何预测一个字符串并停止读取它之前的数字?
有没有更好的方法来阅读整个模式?
我使用 C++11。

编辑:
输入示例:

1 2 3 4 6 abc de 7 8

异常输出:

The string: 'abc de'
Number 1: 7
Number 2: 8

最佳答案

在我看来有几个选项:要么使用 regular expression ,或者使用某种状态机逐个字符地检查输入。

编辑

关于那个状态机...可能是这样的:

// Pre-conditions: "str" is a std::string containing the whole string to be parsed

enum class states
{
GET_LENGTH, // Looking for the embedded string length
GET_LENGTH_OR_STRING, // Get the embedded string, or the length
GET_STRING, // Getting the embedded string
GET_NUMBER_1, // Look for the first number after the string
GET_NUMBER_2, // Look for the second number after the string
};

int len = 0; // Length of the embedded string
std::string tmp; // Temporary string
int n1, n2; // The numbers after the string
states state = GET_LENGTH;

for (auto ci = str.begin(); ci != str.end(); )
{
// Skip whitespace
while (isspace(*ci))
ci++;

switch (state)
{
case GET_LENGTH:
while (isdigit(*ci))
tmp += *ci++;
len = strtol(tmp.c_str(), nullptr, 10);

state = GET_LENGTH_OR_STRING;
break;

case GET_LENGTH_OR_STRING:
if (isdigit(*ci))
state = GET_LENGTH;
else
state = GET_STRING;
break;

case GET_STRING:
tmp = std::string(ci, ci + len);
ci += len;
tmp = "";
state = GET_NUMBER_1;
break;

case GET_NUMBER_1:
while (isdigit(*ci))
tmp += *ci++;
n1 = strtol(tmp.c_str(), nullptr, 10);
break;

case GET_NUMBER_2:
while (isdigit(*ci))
tmp += *ci++;
n2 = strtol(tmp.c_str(), nullptr, 10);
break;
}
}

免责声明:这未经测试,只是直接在浏览器中“按原样”编写。

代码可能会更好,比如获取长度和尾数的状态基本相同,可以放在单独的函数中共享。

关于c++ - 解析复杂的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8322267/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com