Avatar billede nameless Nybegynder
11. december 2003 - 21:56 Der er 16 kommentarer og
1 løsning

string replacement

Skal lave en funktion der kan erstatte noget i en string

har fx denne string:
Char *Test = "Heysa med dig<13>Dette er en test. Der skulle gerne stå ET her: <49>"

Og så skal funktionen erstatte <???> med det char der har det nummer. den skal virke båede ved <?> og <??> og <???>
Har bikset med det et stykke tid nu og kan ikke få det til at funke.
Avatar billede arne_v Ekspert
11. december 2003 - 22:09 #1
Prøv den her:

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 kald som:

char test[] = "Heysa med dig<13>Dette er en test. Der skulle gerne stå ET her: <49>"
replace(test,"<13>","\r");
replace(test,"<49>","2");
Avatar billede arne_v Ekspert
11. december 2003 - 22:13 #2
replace(test,"<13>","\n");
replace(test,"<49>","1");

virker nok bedre !

:-)
Avatar billede arne_v Ekspert
11. december 2003 - 22:16 #3
Kode:

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

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;
}

int main()
{
  char test[] = "Heysa med dig<13>Dette er en test. Der skulle gerne stå ET her: <49>";
  replace(test,"<13>","\n");
  replace(test,"<49>","1");
  printf("%s\n",test);
  return 0;
}

output:

Heysa med dig
Dette er en test. Der skulle gerne st&#963; ET her: 1
Avatar billede arne_v Ekspert
11. december 2003 - 22:16 #4
Og det er med vilje at jeg har ændret fra
  char *test
til
  char test[]
Avatar billede nameless Nybegynder
11. december 2003 - 22:18 #5
Tror du har mistforstået mig lidt.. Det skal virke fra 1 til 255.. Vil du så have jeg skal lave 255 replaces ?
Findes der ikke en måde hvor den laver tallende indeni om til char ?
Avatar billede arne_v Ekspert
11. december 2003 - 22:33 #6
Principielt kunne du godt gøre det med 255 kald af den replace.

Der er ikke nogen supersmart måde at lave den erstat på.

Man kan godt skrive noget kode der er betydligt mere optimalt end
255 kald af min replace.
Avatar billede nameless Nybegynder
11. december 2003 - 22:43 #7
255 linjer med replace ser ikke ligefrem godt ud :| Havde fundet dit eksempel før jeg oprettede spørgsmålet men det der med at finde tal inde i strengen ud var mit store problem
Avatar billede nameless Nybegynder
11. december 2003 - 22:45 #8
For E = 1 to 255
  Test = Replace(Test,"<" & E & ">",Chr(E))
Next E

Som overstående skal det virke..
Kan godt finde ud af VB men er ikke særlig skrap til C++
Avatar billede arne_v Ekspert
11. december 2003 - 22:48 #9
Det er jo også 255 kald af replace.

char buf1[6];
char buf2[2];
for(int i = 1; i <= 255; i++)
{
  sprintf(buf1,"<%d>",i);
  sprintf(buf2,"%c",i);
  replace(test,buf1,buf2);
}

bør gøre det.
Avatar billede arne_v Ekspert
11. december 2003 - 22:49 #10
Men det kan stadigvæk optimeres !
Avatar billede nameless Nybegynder
11. december 2003 - 22:58 #11
Ved replace leder den jo hele strengen igennem.
Det smarteste ville nok være at finde tegnet "<" og så se efter om en af de næste 4 var tegnet ">".. Har lavet en kode der finder den nøjagtige position af overstående..
Altså Jeg har hvor det er og hvor mange tegn det er..
Så skal jeg bare have lavet såden den copiere det ud i en char..
Det vil jo helt klart give betydelig mindre "arbejdsproccess.." tjek følgene kode:
    char *Test = "HEYSA<13>Med Dig";
    int Laengde = strlen(Test);
    for(int E = 0; E < Laengde;E++)
    {
        char FinalChar;
        if(int(Test[E]) == 60)
        {
            int TempE = 2;
            while(TempE < 5)
            {
                if(int(Test[E + TempE]) == 62)
                    break;
                TempE++;
            }
            if(TempE == 5)
                cout << "Fejl" << endl;
            else
                cout << "start:" << E + 1 << ". Laengde:" << TempE - 1 << endl;
        }
    }
//Tror du der er chance for at du kan give et tip til resten ?
Avatar billede arne_v Ekspert
11. december 2003 - 23:02 #12
Jeg tror at jeg vil lave en lidt anderledes løsning.

Stay tuned.
Avatar billede nameless Nybegynder
11. december 2003 - 23:02 #13
Det eneste jeg ikke kan finde ud af er er få copieret det ud i en anden char*(1-3 bogstaver).. Så kan jeg jo bare lave den char* om til en integer og chekke om den er 1 til 255 hvorefter jeg laver den om til char*(et tegn)

Håber du forstår hvad jeg mener
Avatar billede nameless Nybegynder
11. december 2003 - 23:03 #14
Okay .. Venter spændt ;) Det er jo altid rart at lære noget...
Avatar billede arne_v Ekspert
11. december 2003 - 23:15 #15
Kode:

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

void mreplace(char *s)
{
  char *p,*tmp,*ep;
  p = s;
  tmp = (char *)malloc(strlen(s)+1);
  strcpy(tmp,s);
  while(*tmp)
  {
    switch(*tmp)
    {
        case '<':
          *p = strtol(tmp+1,&ep,10);
          p++;
          tmp = ep;
          break;
        case '>':
          tmp++;
          break;
        default:
          *p = *tmp;
          p++;
          tmp++;
        break;   
    }     
  }
  *p = '\0';
  return;
}

int main()
{
  char test[] = "Heysa med dig<10>Dette er en test. Der skulle gerne stå ET her: <49>";
  mreplace(test);
  printf("%s\n",test);
  return 0;
}

output:

Heysa med dig
Dette er en test. Der skulle gerne st&#963; ET her: 1
Avatar billede arne_v Ekspert
11. december 2003 - 23:15 #16
Jeg har måttet erstatte <13> med <10> fordi det er linefeed man bruger
i C til ny linie.
Avatar billede nameless Nybegynder
11. december 2003 - 23:20 #17
Hvad skal jeg sige ? ;) Stygt :P
Jeg takker mange gange..
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