/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Problem med vector og strings.
Fra : Morten Boysen


Dato : 20-01-01 18:01

Jeg er begyndt at læse en bog, som hedder "Accelerated C++". I den er
der en opgave, hvor man ved hjælp af vector'er og string's skal tælle
hvor mange gang et ord optræde i inputtet. Programmet nedenfor virker
tilsyneladende også efter hensigten, men hvis de roptræder mere end 4
ord i inputtet, så opstå der en segmentation fault lige inden
udskivning af det sidste ord.

Progammet er kompileret med g++ 2.96. Jeg kan ikke se problemet, men
måske er der en af jer, der kan?


#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using std::cout;
using std::cin;
using std::endl;
using std::vector;
using std::string;

int main()
{
cout << "Write a sentence and end with EOF: " << endl << endl;
vector<string> invec;
string input;

while(cin >> input)
invec.push_back(input);

cout << "There is a total of " << invec.size()
<< " words in the input" << endl << endl;

sort(invec.begin(), invec.end());

vector<string>::size_type i = 0;
while(i < invec.size()) {
vector<string>::size_type j;
for(j = 1; invec[i] == invec[i + j]; ++j);
cout << "The word " << invec[i] << " appeared "
<< j << " times." << endl;
i += j;
}
return 0;
}


--
Morten Boysen



 
 
Christian Worm Morte~ (20-01-2001)
Kommentar
Fra : Christian Worm Morte~


Dato : 20-01-01 18:24

Hej,

> vector<string>::size_type i = 0;
> while(i < invec.size()) {
> vector<string>::size_type j;
> for(j = 1; invec[i] == invec[i + j]; ++j);

Ups, hvad sker der når i==invec.size()-1 ?


Venlig Hilsen

Christian Worm




Mogens Hansen (20-01-2001)
Kommentar
Fra : Mogens Hansen


Dato : 20-01-01 23:04


"Christian Worm Mortensen" <worm@dkik.dk> wrote in message
news:AQja6.51162$W81.529697@twister.sunsite.dk...
> > vector<string>::size_type i = 0;
> > while(i < invec.size()) {
> > vector<string>::size_type j;
> > for(j = 1; invec[i] == invec[i + j]; ++j);
>
> Ups, hvad sker der når i==invec.size()-1 ?
>

Det er ikke "i", som er problemet - det er "j".
Det er ikke givet at "i" nogensinde antager værdien "invec.size()-1" - det
afhænger af input.

Venlig hilsen

Mogens Hansen




Christian Worm Morte~ (21-01-2001)
Kommentar
Fra : Christian Worm Morte~


Dato : 21-01-01 20:46

Hej,

> Det er ikke givet at "i" nogensinde antager værdien "invec.size()-1" - det
> afhænger af input.

Øhh, nej, men ideen er vel at lave et program der ikke fejler uanset
inddata?


Venlig Hilsen

Christian Worm



Mogens Hansen (20-01-2001)
Kommentar
Fra : Mogens Hansen


Dato : 20-01-01 23:04


"Morten Boysen" <morten.boysen@aub.dk> wrote in message
news:ivja6.51057$W81.528745@twister.sunsite.dk...
> Jeg er begyndt at læse en bog, som hedder "Accelerated C++". I den er

Den bog er et rigtigt godt valg!
Det er godt at du løser opgaverne. Spørg hvis du får problemer igen senere.

> vector<string>::size_type i = 0;
> while(i < invec.size()) {

Jeg vil anbefale at du skriver:

while(invec.size() != i) {

fordi det fejler tydeligere, hvis du har lavet en fejl. Så kan du ikke
overse den.

> vector<string>::size_type j;
> for(j = 1; invec[i] == invec[i + j]; ++j);

Du tester ikke om "i+j" er mindre end "invec.size()" inden du bruger
"invec[i + j]" - altså:
for(j = 1; invec.size() != i+j && invec[i] == invec[i + j]; ++j);

I øvrigt er det godt at vænne sig til at benytte initialisering, frem for
asignment - selvom det ikke betyder noget i dette konkrete tilfælde:
vector<string>::size_type j = 1; // Initialized
for(; invec[i] == invec[i + j]; ++j);

Så du får

vector<string>::size_type i = 0;
while(invec.size() != i) {
vector<string>::size_type j = 1;
for(; invec.size() != i+j && invec[i] == invec[i + j]; ++j);
cout << "The word " << invec[i] << " appeared "
<< j << " times." << endl;
i += j;
}

Den kan simpelt omskrives til udelukkende at bruge iteratorer, og "for"
løkker:

for(vector<string>::iterator i = invec.begin(); invec.end() != i;) {
vector<string>::iterator j = i+1;
for(; invec.end() != j && *i == *j; ++j);
cout << "The word \"" << *i << "\" appeared " << j-i << " times" <<
endl;
i = j;
}

Jeg syntes det bliver mere overskueligt og det indeholder færre (gentagne)
beregninger (som "invec[i]" og "invec[i+j]").

Hvis jeg kender Andrew König ret, kommer der en tilsvarende opgave, hvor du
skal bruge "map".

Venlig hilsen

Mogens Hansen



Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408524
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste