Avatar billede nomak Nybegynder
29. april 2003 - 18:55 Der er 12 kommentarer og
1 løsning

hva fejler min funktion? (c)

char * str_replace (char * string,char * search,char *replace)
{
    char * cp = string;
    char * s1;
    char * s2;
    register int z1=0;
    char *tmp = malloc (strlen(string) - strlen(search) + strlen(replace)+1);

    if (!*search) return string;

    while (*cp)
    {
        s1 = cp;
        s2 = search;

        while ( *s1 && *s2 && !(*s1-*s2) )
            s1++, s2++;

        if (!*s2) {
            // Replace String attached

            tmp=strcat(tmp,replace);
              cp+=strlen(search);
              tmp=strcat(tmp,cp);
              strcpy(string,tmp);
              free(tmp);

            string=str_replace(string,search,replace);
              return string;
          }

        tmp[z1]=string[z1];
        tmp[z1+1]=0;

        cp++;
        z1++;
    }

    free(tmp);
    return string;
}

Den må fejle et eller andet, for den giver en Bus error (Core dumped)

(fandt den på nettet)
Avatar billede nomak Nybegynder
29. april 2003 - 19:01 #1
replace.c:10: warning: initialization makes pointer from integer without a cast

linie 10 er:
char *tmp = malloc (strlen(string) - strlen(search) + strlen(replace)+1);
Avatar billede arne_v Ekspert
29. april 2003 - 19:18 #2
char *tmp = (char *)malloc (strlen(string) - strlen(search) + strlen(replace)+1);
Avatar billede arne_v Ekspert
29. april 2003 - 19:20 #3
Jeg synes iøvrigt at det er noget grimt kode.
Avatar billede - Nybegynder
29. april 2003 - 19:22 #4
tror du skal typecaste det returnerede til en char da 
"void * = malloc (strlen(string) - strlen(search) + strlen(replace)+1);"
Avatar billede arne_v Ekspert
29. april 2003 - 19:22 #5
Jeg har selv brugt følgende kode:

#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 nomak Nybegynder
29. april 2003 - 20:01 #6
arne_v dit eksempel, er det C eller C++?
Avatar billede arne_v Ekspert
29. april 2003 - 20:04 #7
Det skulle compile med en ren C compiler !
Avatar billede nomak Nybegynder
29. april 2003 - 20:24 #8
jeg har prøvet lidt med din funktion..

#include <stdlib.h>
#include <string.h>
#include <stdio.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;
}

int main(void) {
    char str[40] = "hejsa \n\r";
    char ok[40];

    ok = replace(str, "\n\r", "");
    return 1;
}

men det giver en fejl..

-bash-2.05b$ cc -o replace replace.c
replace.c: In function `main':
replace.c:32: void value not ignored as it ought to be
-bash-2.05b$
Avatar billede arne_v Ekspert
29. april 2003 - 20:30 #9
Det er fordi min variant skal bruges som:

int main(void) {
    char str[40] = "hejsa \n\r";
    replace(str, "\n\r", "");
    return 1;
}

og så retter den direkte i str.
Avatar billede arne_v Ekspert
29. april 2003 - 20:31 #10
Du kan evt. bruge:

int main(void) {
    char str[40] = "hejsa \n\r";
    char ok[40];
    strcpy(ok, str);
    replace(ok, "\n\r", "");
    return 1;
}
Avatar billede nomak Nybegynder
29. april 2003 - 21:23 #11
jeg takker :)
Avatar billede arne_v Ekspert
29. april 2003 - 21:25 #12
Det er iøvrigt lidt usædvaneligt med \n\r normalt er det \r\n.
Avatar billede nomak Nybegynder
29. april 2003 - 21:27 #13
det er vel en smagssag :)
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

Seneste spørgsmål Seneste aktivitet
I dag 12:22 Excel Makroer programmering bit32 - bit64 Af bhh i Excel
I går 21:13 Samsung tv Af life53@live.dk i Andre styresystemer
I går 21:03 Mount kommando Af Uvanga i Windows
I går 20:40 Eliminer kendte Af andershl i Excel
I går 18:22 Repeater. Af Bit i Mobilnetværk