Avatar billede jakobdo Ekspert
27. maj 2003 - 18:20 Der er 9 kommentarer og
1 løsning

Finder pattern i streng, og replace med anden tekst.

Hej,
(så nærmer afleveringen sig! Klokken 12.00 i morgen) :o/
hvis jeg har en streng som denne:

char streng[]="HEJ HER ER MORSEPER\r\nHvad så gamle dreng\r\n";

Så vil jeg have en funktion, som finder \r\n og replacer med <br>

Kan det lade sig gøre på en smart måde??
Eller skal jeg kode mit eget ??
Avatar billede gumbert Nybegynder
27. maj 2003 - 18:43 #1
>>Jakobdo. Kender ikke en smart måde men er ved at lære c++ og vil gerne have lidt erfaring, så vil gerne lave funktionen der kan for dig. (har selvfølgelig en ide om hvordan den skal se ud) :D
Avatar billede jakobdo Ekspert
27. maj 2003 - 18:54 #2
Dette kode! (modificeret Arne_V kode) :o)

Klarer næsten opgaven...

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

int main()
{
  int len;
  char buffer[]="Hej\r\nMorsePer\r\nTest\r\nHvad så?\r\n";
  char temp[100];
  char result[20];
  char *p1,*p2;
  p1 = buffer;
  memset(temp,'\0',100);
  while((p2=strstr(p1,"\r\n"))!=NULL) {
    len = p2-p1;
    strncpy(result,p1,len);
    result[len]='\0';
    sprintf(result,"%s<br>",result);
    //printf("%s\n",result);
    strcat(temp,result);
    p1=p2+strlen("<->");
  }
  printf(temp);
  return 0;
}

Jeg får dog følgende ud: Hej<br>orsePer<br>est<br>vad så?<br>
Første bogstav mangler i hvert ord! (dog ikke HEJ)....
Avatar billede jakobdo Ekspert
27. maj 2003 - 18:56 #3
Fejlen er fundet og rettet....

p1=p2+strlen("<->");

Skal jo være:
p1=p2+strlen("\r\n");
Avatar billede arne_v Ekspert
27. maj 2003 - 18:57 #4
Der er ikke noget i ANSI C string.h men det er nemt at skrive
noget.

Jeg har selv brugt:

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

void replace(char *s,char *s1,char *s2)
{
  int i,j;
  char *tmp;
  tmp = 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';
  return;
}
Avatar billede jakobdo Ekspert
27. maj 2003 - 19:12 #5
Er min "egen" funktion ikke lige så god??

Og når du bruger malloc, bør du så ikke bruge FREE()?
Avatar billede jakobdo Ekspert
27. maj 2003 - 19:17 #6
Arne_V: med din kode får jeg: Segmentation fault (core dumped) :o(
Avatar billede jakobdo Ekspert
27. maj 2003 - 19:27 #7
Arne_V, er jeg for dum til at bruge din funktion?
Hvad er s?
Hvad er s1?
Hvad er s2?

s = pattern...
s1 = streng1 (som indeholder data, med \r\n
s2 = streng2 (som kommer til at indeholde data, hvor \r\n er replaced med <br>)
Avatar billede jakobdo Ekspert
27. maj 2003 - 19:42 #8
Skulle bare lige tænke lidt...
Din virker også fint Arne_V! (hvem havde dog også tvivlet)
Jeg var bare for dum til at regne den ud!!

Til andre:

S = STRENG
S1 = pattern som skal findes.
S2 = pattern som erstatter S1
Avatar billede arne_v Ekspert
27. maj 2003 - 20:02 #9
1)  Jeg havde ikke set din kode da jeg postede (det tog lidt tid
    at finde den kode stump).

2)  Jge formoder da at din kode virker lige så godt.

3)  Ja - der mangler en free(tmp) til sidst.

4)  Du har selv regnet argumenterne ud.
Avatar billede jakobdo Ekspert
27. maj 2003 - 20:31 #10
:o)
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