5
#include <iostream>
#include <string>
#include <vector>

/*
  Using STL's string class because the problem does not refer any
  limits regarding the number of characters per line.
 */

using namespace std;

int main()
{
  string line;
  vector<string> lines;
  while (getline(cin, line))
  {
    lines.push_back(line);
  }

  unsigned int i, u;
  unsigned int opening = 1; // 2 if last was opening, 1 if it was closing
  for (i = 0; i < (int) lines.size(); i++)
  {
    for (u = 0; u < (int) lines[u].length(); u++)
    {

    }
  }

  return 0;
}

数行 (入力ファイル) を読み取るだけの単純なコードがあります。

"To be or not to be," quoth the Bard, "that
is the question".
The programming contestant replied: "I must disagree.
To `C' or not to `C', that is The Question!"

ただし、最初の行 (4 文字目) で ' ' (スペース) 文字を読み取るため、SEGFAULTing であることがわかりました。

(gdb) run < texquotes_input.txt 
Starting program: /home/david/src/oni/texquotes < texquotes_input.txt

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7b92533 in std::string::length() const () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6

理由が本当にわかりません。ループ内で何もしていません。ただループしているだけです。

4

2 に答える 2

6

私はすでに問題を見つけました。それは内側のループです:

for (u = 0; u < (int) lines[u].length(); u++)
{

}

次のようにする必要があります。

for (u = 0; u < (int) lines[i].length(); u++)
{

}
于 2013-03-03T15:15:27.920 に答える
2

別の回答では、インデックスのタイプミスがすでに発見されています。

範囲ベースのforループを使用すると、ループがより「暗黙的」であるため、これらの種類の問題が発生しにくくなることを付け加えたいと思います。

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main()
{
  string line;
  vector<string> lines;
  while (getline(cin, line))
  {
    lines.push_back(line);
  }

  for ( const auto& currLine : lines )
  {
    for ( auto ch : currLine )
    {
      cout << ch;  
    }
    cout << '\n';
  }
}
于 2013-03-03T15:51:29.187 に答える