Article View: be.comp.programming
Article #2423Probleem met strings in C++
From: Skender
Date: Fri, 18 Jun 2004 22:48
Date: Fri, 18 Jun 2004 22:48
206 lines
5854 bytes
5854 bytes
Ik heb een programmatje geschreven dat postcodes zoekt als oefening op
strings, maar het werkt niet zoals het zou moeten.
Ik heb een bestand "belgie" dat postcodes bevat. Een lijn per gemeente,
zoals bijvoorbeeld
9000Gent
9840De Pinte
Ik heb een class Gemeente, die 2 strings bevat: de code en de naam.
Dan heb ik een functie Gemeente::naamBevat(char*), waarmee je kunt zien of
de opgegeven string in de naam voorkomt. De code ziet er zo uit:
bool Gemeente::naamBevat(char* gezocht){
return strstr(getNaamKlein(),gezocht) != 0;
}
getNaamKlein() geeft de naam van de gemeente in kleine letters. Dit werkt
perfect, maar het zou beter zijn indien de string gezocht ook eerst werd
omgezet in kleine letters:
char *strlwr (char* tekst){
int aantal=strlen(tekst);
char* res = new char[aantal];
for(int i=0; i<aantal; i++)
res[i]=tolower(tekst[i]);
return res;
}
bool Gemeente::naamBevat(char* gezocht){
return strstr(getNaamKlein(),strlwr(gezocht)) != 0;
}
Maar hier loopt het mis. Compileren levert geen problemen, maar als ik een
gemeente zoek, vindt ik niet alle mogelijke resultaten. Sommige vind ik
wel, andere niet. Toeval of niet: vooral de gemeenten in het Brusselse
geven problemen ;-)
Ik gebruik de gcc versie 3.3.3 onder Linux
Ik heb net hetzelfde programma met net dezelfde lijst gemeenten laten draain
op OpenBSD met de gcc versie 2.95.3 en daar werkt het op het eerste zicht
wel goed!
Wat is er nu eigenlijk mis? Is er een probleem met dat bestand met
postnummers? Zit er een fout in m'n code? Of zou het aan de compiler
liggen?
Bedankt,
Skender
De postcodes staan op http://vrijzijn.be/belgie
M'n code:
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
class Gemeente{
private:
char postnummer[5];
char* naam;
public:
void setNaam(char*);
void setCode(char*);
char* getNaam();
char* getCode();
bool naamBevat(char*);
bool codeBevat(char*);
char* getNaamKlein();
};
char *strlwr (char* tekst){
int aantal=strlen(tekst);
char* res = new char[aantal];
for(int i=0; i<aantal; i++)
res[i]=tolower(tekst[i]);
return res;
}
void Gemeente::setNaam(char* invoer){
naam = new char [strlen(invoer)];
strcpy(naam,invoer);
}
void Gemeente::setCode(char* invoer){
strcpy(postnummer,invoer);
}
char* Gemeente::getNaam(){
return naam;
}
char* Gemeente::getCode(){
return postnummer;
}
char* Gemeente::getNaamKlein(){
return strlwr(naam);
}
bool Gemeente::naamBevat(char* gezocht){
return strstr(getNaamKlein(),strlwr(gezocht)) != 0;
}
bool Gemeente::codeBevat(char* gezocht){
return !(strstr(getCode(),gezocht) == 0);
}
bool isCijfer(char* invoer){
bool resultaat=true;
int teller=0;
while(resultaat && invoer[teller]!=0){
if(invoer[teller]<'0' || invoer[teller]>'9')
resultaat=false;
teller++;
}
return resultaat;
}
int telLijnen(char* naam,int &maxLengte){
char hulpChar;
int aantal=0;
int teller=1;
maxLengte=0;
ifstream bestand;
bestand.open(naam);
if(!bestand)
aantal=0;
else{
hulpChar=bestand.get();
while(!bestand.eof()){
if(hulpChar=='\n'){
aantal++;
if(teller>maxLengte)
maxLengte=teller;
teller=0;
}
hulpChar=bestand.get();
teller++;
}
}
bestand.close();
return aantal;
}
void vulTabel(char* naam, Gemeente* lijst, int aantal, int maxLengte){
char hulpChar;
ifstream bestand;
bestand.open(naam);
int hulpInt;
int teller=0;
char hulpString[maxLengte];
char codeString[5];
codeString[4]=0;
for(int i=0; i<aantal; i++){
for(int y=0; y<4; y++){
codeString[y]=bestand.get();
}
lijst[i].setCode(codeString);
hulpChar=bestand.get();
teller=0;
while(hulpChar!='\n'){
hulpString[teller]=hulpChar;
hulpChar=bestand.get();
teller++;
}
hulpString[teller]=0;
lijst[i].setNaam(hulpString);
}
bestand.close();
}
int main(int argc, char** argv){
//Aantal gemeentes tellen
int maxLengte;
int aantal=telLijnen("belgie",maxLengte);
if(aantal==0){
cout<<"Geen postcodes beschikbaar"<<endl;
return 66;
}
//Gemeentes in tabel stoppen
Gemeente lijst[aantal];
vulTabel("belgie",lijst,aantal,maxLengte);
//Zoeken
if(argc==2){
cout<<"gezocht op "<<argv[1]<<" in "<<aantal<<" gemeentes"<<endl;
if(isCijfer(argv[1])){
for(int i=0; i<aantal;i++){
if(lijst[i].codeBevat(argv[1]))
cout<<lijst[i].getCode()<<'\t'<<lijst[i].getNaam()<<endl;
}
} else {
for(int i=0; i<aantal;i++){
if(lijst[i].naamBevat(argv[1]))
cout<<lijst[i].getCode()<<'\t'<<lijst[i].getNaam()<<endl;
}
}
} else {
cout<<"Geen zoekopdracht opgegeven"<<endl;
}
return 0;
}
Technical Details
Message-ID:
<6jKAc.159880$da2.8238210@phobos.telenet-ops.be>Path:
arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!news.glorb.com!transit.nntp.hccnet.nl!newsrouter.london1.eu.level3.net!level3eu!ossa.telenet-ops.be!phobos.telenet-ops.be.POSTED!not-for-mailShow Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII-7-bit X-Google-Thread: fcea4,f17987ac718646c6 X-Google-Attributes: gidfcea4,public Path: arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!news.glorb.com!transit.nntp.hccnet.nl!newsrouter.london1.eu.level3.net!level3eu!ossa.telenet-ops.be!phobos.telenet-ops.be.POSTED!not-for-mail From: Skender <Skender@GeenSpamAUB.VrijZijn.be> Subject: Probleem met strings in C++ Newsgroups: be.comp.programming Lines: 207 User-Agent: KNode/0.7.7 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7Bit Message-ID: <6jKAc.159880$da2.8238210@phobos.telenet-ops.be> Date: Fri, 18 Jun 2004 22:48:34 GMT NNTP-Posting-Host: 213.118.63.17 X-Complaints-To: abuse@telenet.be X-Trace: phobos.telenet-ops.be 1087598914 213.118.63.17 (Sat, 19 Jun 2004 00:48:34 MEST) NNTP-Posting-Date: Sat, 19 Jun 2004 00:48:34 MEST Organization: Telenet Internet