Avatar billede ladyhawke Novice
28. oktober 2004 - 12:07 Der er 15 kommentarer og
1 løsning

fjern forekomst af streng

Simpelt spørgsmål går jeg ud fra:

Jeg har en TCHAR tzValue som indeholder en streng. fra den streng vil jeg gerne fjerne forekomst af strengen "test"

Hvordan gør man det?
Avatar billede sovsekoder Nybegynder
28. oktober 2004 - 12:30 #1
måske noget i denne stil:
#include "atlstr.h"
int _tmain(int argc, _TCHAR* argv[])
{
    // Test  streng
    TCHAR uniString[] = _T("Test is fun, test is cool");
    // Lav CString udfra TCHAR*
    CString strTest(uniString);
    // Replace alle "test"
    strTest.Replace(_T("test"), _T(""));
    // Kopier resultatet tilbage til TCHAR*
    strncpy(uniString, strTest.GetBuffer(), strTest.GetLength());
    // Sørg for at nul terminere strengen
    uniString[strTest.GetLength()] = '\0';
    // Udskriv den
    printf("%s", uniString);
    return 0;
}
Avatar billede sovsekoder Nybegynder
28. oktober 2004 - 12:33 #2
..og så skal det være CStringT istedet for CString. Hvis man skal bruge sin CStringT strTest efter man har kaldt GetBuffer, skal man kalde strTest.ReleaseBuffer()
Avatar billede ladyhawke Novice
28. oktober 2004 - 12:53 #3
ikke CString, arbejder i win32, så ikke MFC o.l. (beklager det glemte jeg at skrive)
Avatar billede arne_v Ekspert
28. oktober 2004 - 14:22 #4
void replace(char *s,char *s1,char *s2)
{
  int i,j;
  char *tmp;
  tmp = (char *)malloc(strlen(s)+1);
  strcpy(tmp,s);
  i = 0;
  j = 0;
  while(i<strlen(tmp)) {
      if(strncmp(tmp+i,s1,strlen(s1))==0) {
        strcpy(s+j,s2);
        i=i+strlen(s1);
        j=j+strlen(s2);
      } else {
        s[j]=tmp[i];
        i++;
        j++;
      }
  }
  s[j] = '\0';
  free(tmp);
  return;
}

og

replace(s,"test","");
Avatar billede ladyhawke Novice
28. oktober 2004 - 14:27 #5
det lyder lige som det jeg skal bruge...
Avatar billede ladyhawke Novice
28. oktober 2004 - 14:30 #6
fjong! Det virker bare :o)
læg endelig et svar...
Avatar billede ladyhawke Novice
28. oktober 2004 - 15:06 #7
hmmm, blev lige advaret: det er ikke altid at TCHAR kan benyttes på lige fod med char* (16 bit unicod vs 8 bit ansi ?). Ovenstående virker i mit eksempel, men måske er der tegn hvor den fejler...
Avatar billede arne_v Ekspert
28. oktober 2004 - 15:27 #8
For at klare det skal den rettes til:

char -> TCHAR
strcpy -> _tcscpy
strncmp -> _tcsncmp

*sizoef(TCHAR) i malloc
Avatar billede arne_v Ekspert
28. oktober 2004 - 15:30 #9
UTESTET !!

void replace(TCHAR *s,TCHAR *s1,TCHAR *s2)
{
  int i,j;
  TCHAR *tmp;
  tmp = (TCHAR *)malloc(_tcslen(s)*sizeof(TCHAR)+1);
  _tcscpy(tmp,s);
  i = 0;
  j = 0;
  while(i<_tcslen(tmp)) {
      if(_tcsncmp(tmp+i,s1,_tcslen(s1))==0) {
        _tcscpy(s+j,s2);
        i=i+_tcslen(s1);
        j=j+_tcslen(s2);
      } else {
        s[j]=tmp[i];
        i++;
        j++;
      }
  }
  s[j] = (TCHAR)'\0';
  free(tmp);
  return;
}
Avatar billede ladyhawke Novice
28. oktober 2004 - 15:31 #10
mange tak :) Bare lidt surt hvis jeg introducerer en fejl på den konto...
Avatar billede ladyhawke Novice
28. oktober 2004 - 15:32 #11
tester den lige
Avatar billede arne_v Ekspert
28. oktober 2004 - 15:32 #12
Det er vel bate at teste den med og uden _UNICODE defineret.
Avatar billede arne_v Ekspert
28. oktober 2004 - 15:33 #13
og et svar
Avatar billede ladyhawke Novice
28. oktober 2004 - 15:34 #14
det virker i hvert fald mit program, men du har ret man burde måske teste den med/uden unicode, men det bliver senere :o)
Avatar billede arne_v Ekspert
28. oktober 2004 - 15:49 #15
Jeg har testet med unicode.

void replace(TCHAR *s,TCHAR *s1,TCHAR *s2)
{
  int i,j;
  TCHAR *tmp;
  tmp = (TCHAR *)malloc((_tcslen(s)+1)*sizeof(TCHAR)); // <---- lille rettelse
  _tcscpy(tmp,s);
  i = 0;
  j = 0;
  while(i<_tcslen(tmp)) {
      if(_tcsncmp(tmp+i,s1,_tcslen(s1))==0) {
        _tcscpy(s+j,s2);
        i=i+_tcslen(s1);
        j=j+_tcslen(s2);
      } else {
        s[j]=tmp[i];
        i++;
        j++;
      }
  }
  s[j] = (TCHAR)'\0';
  free(tmp);
  return;
}

og det ser ud til at virke
Avatar billede ladyhawke Novice
28. oktober 2004 - 15:55 #16
tak for indsatsen, det var godt!
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