2013-03-03 6 views
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; 
} 

Ich habe so einfach Code, der nur über ein paar Zeilen liest (Eingabedatei):STL String :: length() Speicherzugriffsfehler

"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!" 

Allerdings fand ich, dass es Speicherzugriffsfehler, da es ein liest ‚‘ (Leerzeichen) Zeichen in der ersten Zeile (4 Zeichen):

(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 

ich kann wirklich nicht verstehen, warum, ich bin in der Schleife nichts zu tun, ich bin Looping nur.

+2

Excellent „kleine komplett kompilierbares Beispiel ". –

+0

Faustregel: Wenn in der stdlib ein segfault vorhanden ist, lesen/schreiben/löschen Sie wahrscheinlich wo Sie nicht sollten;). –

Antwort

6

Ich habe bereits das Problem gefunden. Es ist die innere Schleife:

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

} 

werden soll:

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

} 
2

in einer anderen Antwort wurde der Index Tippfehler bereits gesichtet.

Ich möchte, dass bereichsbasierte for Schleifen diese Art von Problemen mit hinzuzufügen, sind schwieriger zu passieren, da die Schleife Art mehr „implizite“ ist:

#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'; 
    } 
} 
+0

Toller Tipp, danke! –

+0

Gern geschehen. –