Avatar billede sunlock Nybegynder
10. maj 2004 - 13:44 Der er 8 kommentarer og
3 løsninger

Check efter bestemte tegn

Jeg har en string af tegn - jeg skal checke om det er lovlige tegn (a-z, A-Z og 0-9).

Er der en smart måde at gøre det eller skal det bare være med en if(tegn != "a" || tegn != "A" ... )?
Avatar billede medions Nybegynder
10. maj 2004 - 13:45 #1
Du kan jo bruge Reg. Exp. til det.

//>Rune
Avatar billede medions Nybegynder
10. maj 2004 - 13:46 #2
Avatar billede medions Nybegynder
10. maj 2004 - 13:47 #3
Arne_V har engang lavet flg. måske kan du bruge det til noget...

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

void testi(char *s)
{
  int v;
  char *ep;
  v = atoi(s);
  printf("%s = %d\n",s,v);
  v = strtol(s, &ep, 10);
  if(ep > s)
  {
      printf("%s = %d\n",s,v);
  }
  else
  {
      printf("%s not number\n",s);
  }
}

void testfp(char *s)
{
  double v;
  char *ep;
  v = atof(s);
  printf("%s = %f\n",s,v);
  v = strtod(s, &ep);
  if(ep > s)
  {
      printf("%s = %f\n",s,v);
  }
  else
  {
      printf("%s not number\n",s);
  }
}

int main()
{
  testi("123");
  testi("abc");
  testfp("123.456");
  testfp("abc.def");
}

Dog er det han har lavet uden Reg. Exp.

//>Rune
Avatar billede arne_v Ekspert
10. maj 2004 - 13:51 #4
if(isalnum(c))

bør gøre det
Avatar billede arne_v Ekspert
10. maj 2004 - 13:52 #5
returnerer true ved store og små bogstaver og tal

#include <ctype.h>

Den returnerer formentligt false for ÆØÅæøå
Avatar billede arne_v Ekspert
10. maj 2004 - 13:55 #6
int isallletterordigit(char *s)
{
  int i;
  for(i=0;i<strlen(s);s++) if(!isalnum(s[i])) return 0;
  return 1;
}

eller

int isidentifier(char *s)
{
  int i;
  if(!isalpha(s[0])) return 0;
  for(i=1;i<strlen(s);s++) if(!isalnum(s[i])) return 0;
  return 1;
}
Avatar billede dilleberg Nybegynder
10. maj 2004 - 22:59 #7
C++ standard metode:

#include <string>
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
  string strTest = "1234+-*/";
  int iPos;

  // Hvis antallet af gyldige tegn er begrænset
  string strLegalChars = "1234";
  iPos = strTest.find_first_not_of(strLegalChars);
  if (iPos != string::npos)
    cout << "--> Pos=" << iPos << " Tegn=" << strTest[iPos] << endl;

  // Hvis antallet af ugyldige tegn er begrænset
  string strIllegalChars = "+-*/";
  iPos = strTest.find_first_of(strIllegalChars);
  if (iPos != string::npos)
    cout << "--> Pos=" << iPos << " Tegn=" << strTest[iPos] << endl;

  return 0;
}

arne_v> I dine for-loops kalder du 'strlen' for hvert gennemløb -> bruger meget tid. Ikke et problem for korte strenge, men en streng med 100000 tegn tager laaaang tid at behandle.
Avatar billede arne_v Ekspert
14. maj 2004 - 22:11 #8
[gensend da kommentar tilsyneladende er forsvundet i sidste nedbrud]

C++ find_first_not_of og find_first_of findes i C som strspn og strcspn, men
jeg synes at isalnum etc. er noget mere sigende.

dilleberg>

Og du har helt ret i at:

len=strlen(s);
for(i=0;i<len;i++)

er hurtigere end:

for(i=0;i<strlen(s);i++)

men performance var ikke lige i min målsætning da den kode blev skitseret
Avatar billede arne_v Ekspert
24. maj 2004 - 23:52 #9
Tid at få afsluttet spørgsmålet ?
Avatar billede sunlock Nybegynder
25. maj 2004 - 08:42 #10
Ja, selvfølgelig. I kampens hede glemte jeg lige dette spørgsmål.

Performance ikke har været et spørgsmål (linierne bliver ikke alt for lange)
Avatar billede sunlock Nybegynder
25. maj 2004 - 08:43 #11
Glemte lige at sige at jeg har testet begge, men valgte arne_v's (da den var mere overskuelig) - håber point-fordelingen er okay :-)
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