STL String::length() SEGFAULTing
#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!"
Однако я обнаружил, что это SEGFAULTing, поскольку он читает символ ' ' (пробел) в первой строке (4-й символ):
(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
Я действительно не могу понять почему, я ничего не делаю внутри цикла, я просто зацикливаюсь.
2 ответа
Решение
Я уже нашел проблему. Это внутренний цикл:
for (u = 0; u < (int) lines[u].length(); u++)
{
}
Должно быть:
for (u = 0; u < (int) lines[i].length(); u++)
{
}
В другом ответе опечатка индекса была уже замечена.
Я хотел бы добавить, что с использованием диапазона 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';
}
}