C++拆分输入问题

标签 c++ string segmentation-fault strtok

我得到以下形式的输入:

(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;
}

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

最佳答案

您可以使用这个简单的函数:

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&,它有 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

当你给它你的输入时。

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

关于C++拆分输入问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7238700/

相关文章:

c float 和 int 长度问题(段错误)

c++ - 文件末尾的空格导致 C++ 中的 EOF 检查失败

c++ - 添加#pragma loop 后出现段错误

c++ - #在 Visual C++ 2013 中将实际函数名称定义为 __noop

c++ - 为字符串分配内存时获取 SIGSEGV/SIGABRT

C++ "cannot add two pointers",将硬编码字符串添加到 CString

c++ - 错误 LNK2019 : unresolved external symbol _wWinMain@16 referenced in function ___tmainCRTStartup

用于匹配 JSON 子字符串的某些部分的 Java 正则表达式

c - 将十六进制值存储到寄存器时出现段错误

c - 段错误和结构