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

J'ai ce code simple qui lit un peu plus de quelques lignes (fichier d'entrée):STL String :: longueur() SEGFAULTing

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

Cependant, je trouve qu'il est SEGFAULTing comme il lit un « » (espace) caractère de la première ligne (4 caractères):

(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 

Je ne comprends vraiment pas pourquoi, je ne fais rien dans la boucle, je suis juste en boucle.

+2

Excellent « petit complet exemple compilable ". –

+0

Règle de base: S'il y a un segfault dans stdlib vous lisez/écrivez/effacez probablement où vous ne devriez pas;). –

Répondre

6

J'ai déjà trouvé le problème. Il est la boucle intérieure:

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

} 

devrait être:

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

} 
2

Dans une autre réponse à la faute de frappe d'index a déjà été repéré.

Je voudrais ajouter que l'utilisation de base gamme-for boucles ces types de problèmes sont plus difficiles à se produire, puisque la boucle est en quelque sorte plus « implicite »:

#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

Bon conseil, merci! –

+0

De rien. –