Avatar billede ferret Nybegynder
21. november 2003 - 11:06 Der er 9 kommentarer og
1 løsning

Isoler tal fra en tekststreng

Jeg er ved at skrive et program til ligings løsning og mangler en function til at isolere tal fra en streng af tekst som f.eks 43x+4, min ide ligner noget a al:

  while((TEST[i] > 48) && (TEST[i]<57)){
        TEST[i] = TESTU[i];
        i++;}

Men det virker ikke som om det virker, findes der en fuction i nogle af standart lib'sene?
Avatar billede arne_v Ekspert
21. november 2003 - 11:13 #1
Det kan godt laves med en for løkke som løber igennem strengen
og smider det fundne over i f.eks. et array af structs med type, numval
og varnavn.

Men overvej at bruge en scanne generator som f.eks. lex/flex.
Avatar billede ferret Nybegynder
21. november 2003 - 11:27 #2
Links, please. Eller kode.
Avatar billede segmose Nybegynder
21. november 2003 - 11:33 #3
Du tester på TEST og flytter TESTU

while((TESTU[i] > 48) && (TESTU[i]<57)) { // test forudsætter ACSII char.
  TEST[i] = TESTU[i]; // mener du det fra samme index til samme index?
  i  ;
}

Du kunne måske se på strspn:
char *TEST, *TESTU; // peger på passende værdier.
strncpy(TEST, TESTU, strspn(TESTU, "0123456789"));
Avatar billede arne_v Ekspert
23. november 2003 - 01:21 #4
Prøv og se på dette eksempel:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define NONE 0
#define NUM 1
#define VAR 2

#define FLUSH buf[bufix] = '\0'; \
              if(mode==NUM) printf("number = %d\n",atoi(buf)); \
              if(mode==VAR) printf("variable = %s\n",buf); \
              mode = NONE; \
              bufix = 0;

void parse(char *s)
{
  int i;
  int mode;
  int bufix;
  char buf[10];
  mode = NONE;
  bufix = 0;
  for(i=0;i<strlen(s);i++)
  {
      if(s[i]=='*')
      {
    FLUSH       
        printf("operator *\n");
      }
      else if(s[i]=='+')
      {
        FLUSH
        printf("operator +\n");
      }
      else if(s[i]==' ')
      {
        FLUSH
        /* nothing */
      }
      else if(isdigit(s[i]))
      {
        if(mode==NONE) mode=NUM;
        buf[bufix] = s[i];
        bufix++;
      }
      else if(isalnum(s[i]))
      {
        if(mode==NUM)
        {
            FLUSH
        }
        if(mode==NONE) mode=VAR;
        buf[bufix] = s[i];
        bufix++;
      }
      else
      {
        abort();
      }
  }
  FLUSH
}


int main()
{
  parse("43*x+4");
  parse("43 * x + 4");
  parse("43x+4");
  parse("43 x + 4");
  return 0;
}
Avatar billede arne_v Ekspert
30. november 2003 - 22:52 #5
ferret>

Kommet videre ?
Avatar billede ferret Nybegynder
01. december 2003 - 16:26 #6
Argh sorry, glemte helt dette spm, det må i undskylde. Og nej jeg må sige at jeg ikke helt forstår din kode, ville være rart med lidt dokumentation.
Avatar billede arne_v Ekspert
01. december 2003 - 16:34 #7
mode = hvad man er i gang med
NUM = igang med et tal
VAR = igang med et variabel navn
NONE = igang med noget andet

løkken løber strengen igennem og holder styr på mode og putter tegn i buf

FLUSH er bare en lille macro til at gør enoget som skal gøres mange gange
Avatar billede ferret Nybegynder
01. december 2003 - 17:53 #8
Så hvordan kaldes den? giver man den bare en streng af tekst? Og hvordan kommer inputtet til at se ud?
Avatar billede arne_v Ekspert
01. december 2003 - 18:15 #9
Du kan jo se i min main metode hvordan parse kan kaldes.

Den parse gør ikke noget med input udover at parse og outputte hvad
den parser. I en virkelig applikation skal der naturligvis gøres noget
med output.
Avatar billede ferret Nybegynder
01. december 2003 - 23:32 #10
Ok point til dig min gode mand.
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