🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: be.comp.programming
Article #2423

Probleem met strings in C++

#2423
From: Skender
Date: Fri, 18 Jun 2004 22:48
206 lines
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-mail

Show 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