Toon posts:

[C] foutmelding door strncmp en vraag over regex

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik was een paar dagen geleden hier met het probleem om vanuit het ip-adres de provider te halen. Daar heb ik toen perfect antwoord gekregen en ben toen gaan snuffelen op ripe.net. Daar heb ik ripe.db.inetnum gedownload en ben deze gaan parsen... Dat deed ik met PHP op mn local "servertje". Dat duurt weet ik niet hoeveel uren en is absoluut geen optie. Ik weet niet of het ligt aan mijn manier van code of aan de grootte van het bestand... Nu heb ik een paar jaar geleden iets met C gedaan en wist dat dat sneller moet zijn. Dat is het idd! Alleen is dat echt helemaal weggezakt en heb ik daar nu twee vraagjes over.

1. Met onderstaande code krijg ik een foutmelding, terwijl mij de code correct lijkt, wat hij dus blijkbaar niet is :) "thread stopped" en dat ligt aan regel 14...
2. Binnen PHP kan ik erg prettig met regular expressions werken. Maar daar kan ik geen duidelijke informatie en voorbeelden over vinden. Heeft iemand toevallig een leuk linkje???

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# include <stdio.h>
# include <string.h>

main()
{
   FILE *pnf;
   int val;
   char string[500];
   char *inetnum = "inetnum", *length;
   pnf = fopen("D:\\ripe\\ripe.db.inetnum", "r");
   rewind(pnf);
   while (fgets(string,900000,pnf) != NULL){
         length = strstr (string, inetnum);
         val = strncmp(length, inetnum, 6);
         if (val == 0){
            printf ("%d\t%s\t%s", a, length, string);
         }
         else {
         }
   }
   fclose(pnf);
   return 0;
}

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Verwijderd schreef op 05 August 2003 @ 21:10:
2. Binnen PHP kan ik erg prettig met regular expressions werken. Maar daar kan ik geen duidelijke informatie en voorbeelden over vinden. Heeft iemand toevallig een leuk linkje???
P&W FAQ - Regular expressions
Uit de inhoudelijke FAQ.

Who is John Galt?


Verwijderd

Topicstarter
Oh, wis niet dat dit gelijk was aan Perl...

[ Voor 58% gewijzigd door Verwijderd op 07-08-2003 14:44 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21-08 18:33
Verwijderd schreef op 05 augustus 2003 @ 21:10:
C:
1
2
3
4
...
         length = strstr (string, inetnum);
         val = strncmp(length, inetnum, 6);
...
Als strstr niets vind returned het NULL. Geen idee wat strncmp met een nullpoiter doet, maar het lijkt me dat je die het beste kunt afvangen.

[edit]
Owh, en volgens mij wil je die 900000 ook vervangen door een reeeler getal, say sizeof( string ) :)

[ Voor 14% gewijzigd door farlane op 06-08-2003 00:13 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
THNX, hij werkt bijna perfect... het enige rare is datie het resultaat twee keer afdrukt. Een keer met het nummer van mn counter 'a' ervoor en op de volgende regel staat alleen het resultaat??? Waar kan dat aan liggen???

Ik heb de huidige code ff er onder geplaatst... Is diut trouwens een snelle manier om een file te doorzoeken? Of zijn er andere technieken waarmee dit sneller kan? Het gaat om een bestand met enkele miljoenen regels, dat kost aardig wat tijd en wil het daarom natuurlijk zo snel mogelijkhouden, het moet nml vaker gebruikt gaan worden...
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# include <stdio.h>
# include <string.h>

main()
{
    FILE *pnf;
    int a = 0;
    char string[500];
    char *inetnum = "inetnum", *length;
    pnf = fopen("D:\\ripe\\ripe.db.inetnum", "r");
    rewind(pnf);
    while (fgets(string,sizeof(string),pnf) != NULL){
        length = strstr (string, inetnum);
        if (length != NULL){
            printf ("%d\t%s\t%s", a, length, string);
            a++;
        }
    }
    fclose(pnf);
    return 0;
}


[edit]
Toch nog maar een edit, want na veel kl*te en zelfs wanhopige programmeerconstructies die bijvoorbaat al mislukt waren toch weer de vraag hoe regular expression toe te passen zijn in C... Aan de link van justmental had ik niks aangezien ik al bekend ben met regex, het gaat mij om de implementatie ervan in C.

[ Voor 18% gewijzigd door Verwijderd op 06-08-2003 19:36 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21-08 18:33
Verwijderd schreef op 06 augustus 2003 @ 18:55:
THNX, hij werkt bijna perfect... het enige rare is datie het resultaat twee keer afdrukt. Een keer met het nummer van mn counter 'a' ervoor en op de volgende regel staat alleen het resultaat???

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
# include <stdio.h>
# include <string.h>

main()
{
...
        length = strstr (string, inetnum);
        if (length != NULL){
            printf ("%d\t%s\t%s", a, length, string);
            a++;
        }
....
}
Je code print een int, een string en nog een string.

Stel, je originele string ziet er zo uit: "blaatblaatinetnum\n\0"

dan print ie dus a, die de eerste keer 0 is, dan "inetnum\n" en dan nog een keer "inetnum\n" want daar wijst lenght naar. ( Waarom dat ding length heet is me een raadsel, het is namelijk gewoon een char *.

Overigens, als je string er zo uitziet: "blaatblaatinetnum\nblaatblaatinetnum\n"

zal de werking niet correct zijn. Misschien kun je die strstr en if lus samenvoegen tot iets van
C++:
1
2
3
4
while( ( length = strstr( ... .) ) != NULL )
{
    ...
}


Overigens, je hoeft maar naar een string te zoeken, in een andere string. Waarom denk je dat een regexp hier sneller zou zijn ? Ook in een bestand met miljoenen regels gaat dit verhaal behoorlijk snel denk ik. ( Anders drink je ff een bak koffie :) )

Waarom krijg ik het idee dat je niet echt weet waar je mee bezig bent? Of ben je niet bekent met de printf functie ? Denk er anders eens over om gewoon cout te gebruiken.

[ Voor 20% gewijzigd door farlane op 06-08-2003 20:00 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Thijsch
  • Registratie: Februari 2002
  • Laatst online: 19-08 19:58
Verwijderd schreef op 06 augustus 2003 @ 18:55:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# include <stdio.h>
# include <string.h>

main()
{
    FILE *pnf;
    int a = 0;
    char string[500];
    char *inetnum = "inetnum", *length;
    pnf = fopen("D:\\ripe\\ripe.db.inetnum", "r");
    rewind(pnf);
    while (fgets(string,sizeof(string),pnf) != NULL){
        length = strstr (string, inetnum);
        if (length != NULL){
            printf ("%d\t%s\t%s", a, length, string);
            a++;
        }
    }
    fclose(pnf);
    return 0;
}
nou
volgens mij gaat het als volgt:

string bevat bijvoorbeeld: "blablaxxxblablablablablalala\n", length is een pointer naar xxx.

als je dan dat print krijg je :

1 \ xxxblablablabla\n (length wijst naar xxx EN alles erna, door de \n komt een nieuwe regel)

\ blablaxxblalbalbal \n

dat komt er waarschijnlijk te staat. Wat je kan doen is ongeveer dit:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
char *foo; 
int b;

pos = strchr(string,'\n');
if(pos)
pos = '\0';

length = strstr (string, inetnum);
       if (length){
              b = strlen(string) - strlen(length);
              foo = (char *)malloc(sizeof(char) * b);
              strncpy(foo,length,b);
              printf ("%d\t%s\t%s", a, foo, string);
              a++;
    }


zoiets, dan copieer je wat je wil naar foo, en hij print alleen xxx.

/edit: te laat, maar het idee is hetzelfde.
farlane schreef op 06 August 2003 @ 19:56:
[...]

Waarom krijg ik het idee dat je niet echt weet waar je mee bezig bent? Of ben je niet bekent met de printf functie ? Denk er anders eens over om gewoon cout te gebruiken.
cout is een C++ functie, dit gaat over C.

[ Voor 22% gewijzigd door Thijsch op 06-08-2003 20:02 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21-08 18:33
Of je fprint alleen de eerste strlen( [TeZoekenString] ) karakters. ( Als dat de bedoeling was. Persoonlijk lijkt het me onzinnig want je zoekt naar een bepaalde string, dus je weet wel hoe die eruit ziet.
Misschien wil de ts wel de context weten waarin die string staat ?
cout is een C++ functie, dit gaat over C.
Owh jah, die had ik ff gemist. ( Overigens is cout geen functie )

[ Voor 15% gewijzigd door farlane op 06-08-2003 20:05 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
Dat was opzich niet helemaal de oplossing, want in feite doetie dan nog steeds hetzelfde, je hebt me wel ff het licht gegeven wat betreft het afdrukken van de string! Ik heb nu length (wat idd gewoon een char* is) weggelaten met afdrukken en nu druktie wel alles netjes af. Dat heet "blind staren op het verkeerd stuk code :)"

THNX A LOT !!!

blijft puntje 2 nog staan ;( Heeft iemand ervaring met het toepassen van regex binnen C???

[edit] @ farlahe: is 3,5 geleden laatste keer c.... en ja, das dan behoorlijk graven....

[ Voor 11% gewijzigd door Verwijderd op 06-08-2003 20:08 ]


  • Thijsch
  • Registratie: Februari 2002
  • Laatst online: 19-08 19:58
farlane schreef op 06 August 2003 @ 20:03:
[...]


Of je fprint alleen de eerste strlen( [TeZoekenString] ) karakters. ( Als dat de bedoeling was.
Oja, dat is natuurlijk handiger, maar dit was even om aan te geven wat ik ongeveer bedoelde.
Owh jah, die had ik ff gemist. ( Overigens is cout geen functie )
ja weet ik, wist ff niet hoe ik het anders uit moest drukken :P

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21-08 18:33
Verwijderd schreef op 06 August 2003 @ 20:05:
blijft puntje 2 nog staan ;( Heeft iemand ervaring met het toepassen van regex binnen C???
Waarschijnlijk zullen daar best wel libs voor bestaan, maar ik zou er zo geen weten.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
Das jammer, ga ik weer verder zoeken :) Bedankt tot zover...

Voor tips over regex in C hou ik me aanbevolen...

[ Voor 31% gewijzigd door Verwijderd op 06-08-2003 20:13 ]


  • Thijsch
  • Registratie: Februari 2002
  • Laatst online: 19-08 19:58
Verwijderd schreef op 06 August 2003 @ 20:05:

blijft puntje 2 nog staan ;( Heeft iemand ervaring met het toepassen van regex binnen C???
regexp in C bestaat niet, het moet ongeveer zo :

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
char *foo = "aaabbbcccdddeeefffggg";
char *pos, *tmp;

/* ccc replacen met zzz */
pos = strstr(foo, "ccc");
if ( pos )
{ 
   pos = '\0';
   tmp = (char *)malloc(sizeof(char) * strlen(string));
   strcpy(tmp,foo);
   strcat(tmp,"zzz");
   strcat(tmp,pos+3);
}
strcpy(foo,tmp);
free(tmp);


In C kan je alleen met mem rondgooien 8)7

[ Voor 5% gewijzigd door Thijsch op 07-08-2003 14:31 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins



:z

Professionele website nodig?


Verwijderd

Topicstarter
Sorry curry684, maar ik kan daar weinig zinnigs vinden. Heb wel wat dingen gedownload maar daar schiet ik niet veel mee op. Daarnaast draai ik Borland C++ 5.02 (das niet de nieuwste nee) op een windows machine en tips met betrekking tot linux heb ik ook niet echt iets aan.... Misschien is het een te grote stap na een paar jaar niet meer gewerkt te hebben met C (heb het een aantal weken tijdens mn opleiding gehad...).

Morgen ga ik maar eens aan de slag met wat PaRaDot heeft gepost: ziet er voor mij wat begrijpelijker uit :) Maar toch bedankt...

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Bliep, ga me nu niet zeggen dat je aan deze link niets hebt, I quote:
PCRE was originally written for the Exim MTA, but is now used by many high-profile open source projects, including Python, Apache, PHP, KDE, Postfix, and Analog.
Oftewel de C-code van de regular expressions als gebruikt in PHP, en dat vind jij niet nuttig? :?

Ter verduidelijking: deze vond ik mbh de eerste hit van die Google-query...

[ Voor 11% gewijzigd door curry684 op 06-08-2003 21:51 ]

Professionele website nodig?


Verwijderd

Topicstarter
/me heeft niet goed genoeg gelezen.... en schaamt zich diep...

Sorry, heb gewoon te snel gelezen en bij het woord "Perl" afgehaakt... Het resultaat gooi ik binnenkort er wel ff op...

PS: ik vind dit superhandig. Bedankt!!!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21-08 18:33
Verwijderd schreef op 06 August 2003 @ 21:42:
Daarnaast draai ik Borland C++ 5.02 ...
Aaaargh, als je de kans krijgt dump die dan heel snel. De meest brakke IDE waarmee ik tot nu toe gewerkt heb .....

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1