Avatar billede ladyhawke Novice
02. august 2002 - 13:51 Der er 5 kommentarer og
1 løsning

flere forekomster af samme streng

Jeg skal undersøge om en bestemt streng forekommer flere gang i en streng (hvor mange) jeg kan finde den første med:

strstr(strLine.c_str(), strCompareTo);

herfra kan jeg få positionen i linien, men hvordan finder jeg ud af om der en flere?
Og hvordan laver jeg en søgning på en substreng (fra position pos til slutningen af linen f.eks.)
Avatar billede soepro Nybegynder
02. august 2002 - 15:15 #1
Brug strtok() funktionen fra <string.h>

String strLine, strCompareTo;
char  *ptrStr;
int    count;

ptrStr = strtok(strLine.C_str(), strCompareTo.c_str());
count  = 0;
while (ptrStr != NULL)
{
  count++;
  // Restore removed delimiter string, as strtok inserts 0x0 at it's place
  strcpy(ptrStr+strlen(ptrStr), strCompareTo.C_str());
  strPtr = strtok(NULL, strCompareTo.c_str());
};

Bemærk krøllen omkring genindsættelse af sammenligningsstrengen - desværre har strtok den skavank at den indsætter character '\x0' der hvor teksten FØR delimited strengen står. Alternativet dertil er simpelthen at lave en temporær kopi af strengen:

String strLine, strCompareTo, tmpStr;
char  *ptrStr;
int    count;

tmpStr = strLine;
ptrStr = strtok(tmpStr.C_str(), strCompareTo.c_str());
count  = 0;
while (ptrStr != NULL)
{
  count++;
  strPtr = strtok(NULL, strCompareTo.c_str());
};
Avatar billede ladyhawke Novice
03. august 2002 - 09:05 #2
kigger på det mandag, det ser brugbart ud :-)
Avatar billede ladyhawke Novice
05. august 2002 - 10:08 #3
Jeg har afprøvet det sidste eksempel, men får:

strtok' : cannot convert parameter 1 from 'const char *' to 'char *'

når jeg prøver at kompilere, hvordan slipper jeg af med den?
Avatar billede ladyhawke Novice
07. august 2002 - 11:26 #4
Jeg kan få det til at virke som jeg gerne vil:

string strLine, strTemp;   
CString temp;
vector<LineData> vec; //resulting vetor   
char *pDest;

int nPosition;
int nLineNumber;

char strCompareTo[] = "Translate("; //search string   
nLineNumber = 0;   
occCount=0;       

ifstream fileStream(filename);
   
if(fileStream.fail())
{
  AfxMessageBox("Error: file could not be found!");       
}

while(!fileStream.eof())
{       
  nLineNumber++;
  getline(fileStream, strLine, '\n');
  strTemp = strLine;           
  pDest = strtok(const_cast<char*>(strTemp.c_str()), strCompareTo);

  while( pDest != NULL )
  {    //the string "Translate(" is found
    //add line number, position and text to vec
    occCount++;
    nPosition = pDest - strLine.c_str() + 1;
    temp = CString(strLine.c_str());
    temp.TrimLeft();
    vec.push_back(LineData(true, nLineNumber, occCount, temp));
    pDest = strtok(NULL, strCompareTo);
  }               
}

Pointen er at jeg vil vide præcis hvor mange forekomster der er af strengen Translate( og hvor på linien de står. Dette skal afleveres til vektoren som opbevarer disse informationer. Hvordan får jeg tilpasset koden til dette?
Avatar billede ladyhawke Novice
07. august 2002 - 11:46 #5
Hvis der ikke gives yderligere på dette spørgmål inden for få dage, vil jeg lukke spørgsmålet og tildele soepro 10p for indsatsen til nu...
Avatar billede soepro Nybegynder
13. august 2002 - 12:02 #6
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester