Avatar billede thjal Nybegynder
11. september 2006 - 15:11 Der er 5 kommentarer og
1 løsning

strtok - kan det tælles hvor mange token tegn der fjernes

Jeg benytter følgende kode:


const int MAX_LENGT = 100;

char LineInMem[] = ".00,,,,,,.000,1.23,exit";
char* token;
char* ArrayOfValues[MAX_LENGTH];
int i = 0;
char seps[] = ",";
       
token = strtok( LineInMem, seps );
while( token != NULL )
{
    /* While there are tokens in "string" */
    ArrayOfValues[i] = token;
    i++;
    /* Get next token: */
    token = strtok( NULL, seps );
}

Det er også meget fint i min ArrayOfValues får jeg noget det ligner: [0]= ".00" [1] = ".000" [2] = "1.23" [3] = "exit". Men 1000$ spørgsmålet er kan jeg på nogen måde se hvor mange "," (kommaer) der er blvet sprunget over før jeg fik en ny værdi i mit token? I dette tilfælde 5 overspringninger.
Avatar billede hardcorewizard Nybegynder
11. september 2006 - 18:35 #1
Da strtok() kun returnerer en pointer, og den pointer ikke kan være NULL når den ikke er færdig med strengen, så vil jeg antage at det er en umulighed. Hvis det er nødvendigt at kende positionen af dit token, så skal du nok skrive din egen parser. Evt. ved hjælp af Lex hvis du har nogle mere avancerede formater også :).
Avatar billede bertelbrander Praktikant
11. september 2006 - 19:58 #2
Hvis det må være C++:
http://damb.dk/strsplit.php

Ellers må du nok skrive din egen, det burde være trivielt.
Avatar billede mollevp Nybegynder
12. september 2006 - 12:02 #3
Du kan lave noget ligende dette:


#include <iostream>

int main()
{
    const int MAX_LENGTH = 100;
   
    char LineInMem[] = ",,.00,,,,,,.000,1.23,exit";
    char seps[] = ",";
   
    char *token; char *lastToken;
   
    char *ArrayOfValues[MAX_LENGTH];
    int i = 0;
   
    lastToken = LineInMem;
    token = strtok( LineInMem, seps );

    while( token != NULL )
    {
   
    std::cout << token << " skippet ";

    /** The first is a special case */
    if(0 < i)
        std::cout << (token != lastToken ? (token - lastToken) - strlen(lastToken) : 0);
    else
        std::cout << (token != lastToken ? (token - lastToken) : 0);

    std::cout << std::endl;

    lastToken = token;
   
    /* While there are tokens in "string" */
    ArrayOfValues[i] = token;
    i++;
   
    /* Get next token: */
    token = strtok( NULL, seps );
   
   
    }

    return 0;
}
Avatar billede thjal Nybegynder
12. september 2006 - 13:26 #4
bertelbrander smid et svar og du skal få pointene - det var lige det der skulle til. :)
Avatar billede bertelbrander Praktikant
12. september 2006 - 22:53 #5
Jeg samler ikke på point.
Avatar billede thjal Nybegynder
13. september 2006 - 11:57 #6
OK - hvis du ikke vil have dem så tager jeg dem selv igen...
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