【问题标题】:C++ Splitting the input problemC++拆分输入问题
【发布时间】:2023-03-30 19:05:01
【问题描述】:

我收到以下形式的输入:

(8,7,15)
(0,0,1) (0,3,2) (0,6,3)
(1,0,4) (1,1,5)
(2,1,6) (2,2,7) (2,5,8)
(3,0,9) (3,3,10) (3,4,11) (3,5,12)
(4,1,13) (4,4,14)
(7,6,15)

我必须记住三元组的数量。我编写了一个快速测试程序来尝试从cin 读取输入,然后拆分字符串以从输入中获取数字。该程序似乎没有读取所有行,它在(1,1,5) 之后停止并随后打印出随机的7

我为我尝试为我的作业创建的功能之一创建了这个快速测试功能:

int main ()
{
  string line;
  char * parse;

  while (getline(cin, line)) {

    char * writable = new char[line.size() + 1];
    copy (line.begin(), line.end(), writable);
    parse = strtok (writable," (,)");

    while (parse != NULL)
    {
      cout << parse << endl;
      parse = strtok (NULL," (,)");
      cout << parse << endl;
      parse = strtok (NULL," (,)");
      cout << parse << endl;
      parse = strtok (NULL," (,)");
    }

  }
  return 0;
}

有人可以帮我修复我的代码或给我一个工作示例吗?

【问题讨论】:

  • 您是否尝试过在调试器下运行它以找到它发生段错误的确切行?
  • 无法复制:ideone.com/k9ZAb
  • @kay 它不再出现段错误,但这里仍然存在一个问题,导致我的输出不正确
  • 您所要做的就是数三倍数?如果您知道这是唯一的格式(即该文件中除了三倍之外什么都没有),那么您可以只计算左括号(
  • 我知道我很挑剔,但是您可以使用字符串的 c_str() 方法将字符串转换为 char *。不易出错。

标签: c++ string segmentation-fault strtok


【解决方案1】:

你可以使用这个简单的功能:

istream& read3(int& a, int& b, int& c, istream& stream = cin) {
    stream.ignore(INT_MAX, '(');
    stream >> a;
    stream.ignore(INT_MAX, ',');
    stream >> b;
    stream.ignore(INT_MAX, ',');
    stream >> c;
    stream.ignore(INT_MAX, ')');

    return stream;
 }

它希望流从( 开始,因此它会跳过任何字符并在它看到的第一个( 之后停止。它将int 读入通过引用传递的a(因此外部a 受此影响),然后读取并跳过它看到的第一个逗号。洗涤,冲洗,重复。然后在读完第三个int之后,就跳过了关闭的),所以准备再做一遍。

它还返回一个istream&amp;,它重载了operator bool,以便在流结束时返回false,这打破了示例中的while循环。

你可以这样使用它:

// don't forget the appropriate headers...
#include <iostream>
#include <sstream>
#include <string>

int a, b, c;

while (read3(a, b, c)) {
    cout << a << ' ' << b << ' ' << c << endl;
}

打印出来的:

8 7 15
0 0 1
0 3 2
0 6 3
1 0 4
1 1 5
2 1 6
2 2 7
2 5 8
3 0 9
3 3 10
3 4 11
3 5 12
4 1 13
4 4 14
7 6 15

当你给它你的输入时。

因为这是一个作业,所以我把它留给你添加错误处理等。

【讨论】:

  • @snpn 你可以用很多方法。一种方法是使用 std::getline 读取一行并计算 # of (,然后将该行包装在 stringstream 中并对其执行 read3。
【解决方案2】:

我在 9 天前写了一篇博客来解析此类输入:

您可以在此处查看输入的输出:http://ideone.com/qr4DA

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 2012-05-12
    相关资源
    最近更新 更多